• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0.1 Transitional//EN">
2
3<html>
4<head>
5<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
6<title>Boost.MultiIndex Documentation - Random access indices reference</title>
7<link rel="stylesheet" href="../style.css" type="text/css">
8<link rel="start" href="../index.html">
9<link rel="prev" href="seq_indices.html">
10<link rel="up" href="index.html">
11<link rel="next" href="key_extraction.html">
12</head>
13
14<body>
15<h1><img src="../../../../boost.png" alt="boost.png (6897 bytes)" align=
16"middle" width="277" height="86">Boost.MultiIndex Random access indices reference</h1>
17
18<div class="prev_link"><a href="seq_indices.html"><img src="../prev.gif" alt="sequenced indices" border="0"><br>
19Sequenced indices
20</a></div>
21<div class="up_link"><a href="index.html"><img src="../up.gif" alt="Boost.MultiIndex reference" border="0"><br>
22Boost.MultiIndex reference
23</a></div>
24<div class="next_link"><a href="key_extraction.html"><img src="../next.gif" alt="key extraction" border="0"><br>
25Key extraction
26</a></div><br clear="all" style="clear: all;">
27
28<hr>
29
30<h2>Contents</h2>
31
32<ul>
33  <li><a href="#rnd_index_fwd_synopsis">Header
34    <code>"boost/multi_index/random_access_index_fwd.hpp"</code> synopsis</a></li>
35  <li><a href="#synopsis">Header
36    <code>"boost/multi_index/random_access_index.hpp"</code> synopsis</a>
37    <ul>
38      <li><a href="#random_access"><code>random_access</code> index specifier</a></li>
39      <li><a href="#rnd_indices">Random access indices</a>
40        <ul>
41          <li><a href="#complexity_signature">Complexity signature</a></li>
42          <li><a href="#instantiation_types">Instantiation types</a></li>
43          <li><a href="#constructors">Constructors, copy and assignment</a></li>
44          <li><a href="#iterators">Iterators</a></li>
45          <li><a href="#capacity">Capacity operations</a></li>
46          <li><a href="#modifiers">Modifiers</a></li>
47          <li><a href="#list_operations">List operations</a></li>
48          <li><a href="#rearrange_operations">Rearrange operations</a></li>
49          <li><a href="#serialization">Serialization</a></li>
50        </ul>
51      </li>
52    </ul>
53  </li>
54</ul>
55
56<h2>
57<a name="rnd_index_fwd_synopsis">Header
58<a href="../../../../boost/multi_index/random_access_index_fwd.hpp">
59<code>"boost/multi_index/random_access_index_fwd.hpp"</code></a> synopsis</a></h2>
60
61<blockquote><pre>
62<span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
63
64<span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
65
66<span class=comment>// random_access index specifier</span>
67
68<span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>TagList</span><span class=special>=</span><span class=identifier>tag</span><span class=special>&lt;&gt;</span> <span class=special>&gt;</span> <span class=keyword>struct</span> <span class=identifier>random_access</span><span class=special>;</span>
69
70<span class=comment>// indices</span>
71
72<span class=keyword>namespace</span> <span class=identifier>detail</span><span class=special>{</span>
73
74<span class=keyword>template</span><span class=special>&lt;</span><b>implementation defined</b><span class=special>&gt;</span> <span class=keyword>class</span> <b>index class name implementation defined</b><span class=special>;</span>
75
76<span class=special>}</span> <span class=comment>// namespace boost::multi_index::detail</span>
77
78<span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
79
80<span class=special>}</span> <span class=comment>// namespace boost</span>
81</pre></blockquote>
82
83<p>
84<code>random_access_index_fwd.hpp</code> provides forward declarations for the
85<a href="#random_access"><code>random_access</code></a> index specifier and
86its associated <a href="#rnd_indices">random access index</a> class.
87</p>
88
89<h2>
90<a name="synopsis">Header
91<a href="../../../../boost/multi_index/random_access_index.hpp">
92<code>"boost/multi_index/random_access_index.hpp"</code></a> synopsis</a></h2>
93
94<blockquote><pre>
95<span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>initializer_list</span><span class=special>&gt;</span>
96
97<span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
98
99<span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
100
101<span class=comment>// random_access index specifier</span>
102
103<span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>TagList</span><span class=special>=</span><span class=identifier>tag</span><span class=special>&lt;&gt;</span> <span class=special>&gt;</span> <span class=keyword>struct</span> <span class=identifier>random_access</span><span class=special>;</span>
104
105<span class=comment>// indices</span>
106
107<span class=keyword>namespace</span> <span class=identifier>detail</span><span class=special>{</span>
108
109<span class=keyword>template</span><span class=special>&lt;</span><b>implementation defined</b><span class=special>&gt;</span> <span class=keyword>class</span> <b>index class name implementation defined</b><span class=special>;</span>
110
111<span class=comment>// index comparison:</span>
112
113<span class=comment>// <b>OP</b> is any of ==,&lt;,!=,&gt;,&gt;=,&lt;=</span>
114
115<span class=keyword>template</span><span class=special>&lt;</span><b>arg set 1</b><span class=special>,</span><b>arg set 2</b><span class=special>&gt;</span>
116<span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span>
117  <span class=keyword>const</span> <b>index class name</b><span class=special>&lt;</span><b>arg set 1</b><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span><span class=keyword>const</span> <b>index class name</b><span class=special>&lt;</span><b>arg set 2</b><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>);</span>
118
119<span class=comment>// index specialized algorithms:</span>
120
121<span class=keyword>template</span><span class=special>&lt;</span><b>implementation defined</b><span class=special>&gt;</span>
122<span class=keyword>void</span> <span class=identifier>swap</span><span class=special>(</span><b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span><b>index class name</b><span class=special>&amp;</span> <span class=identifier>y</span><span class=special>);</span>
123
124<span class=special>}</span> <span class=comment>// namespace boost::multi_index::detail</span>
125
126<span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
127
128<span class=special>}</span> <span class=comment>// namespace boost</span>
129</pre></blockquote>
130
131<h3><a name="random_access">
132<code>random_access</code> index specifier
133</a></h3>
134
135<p>
136This index specifier allows for insertion of a <a href="#rnd_indices">random
137access index</a>.</p>
138
139<blockquote><pre>
140<span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>TagList</span><span class=special>=</span><span class=identifier>tag</span><span class=special>&lt;&gt;</span> <span class=special>&gt;</span> <span class=keyword>struct</span> <span class=identifier>random_access</span><span class=special>;</span>
141</pre></blockquote>
142
143<p>If provided, <code>TagList</code> must be an instantiation of
144<a href="indices.html#tag"><code>tag</code></a>.
145</p>
146
147<h3><a name="rnd_indices">Random access indices</a></h3>
148
149<p>
150Random access indices are free-order sequences with constant time
151positional access and random access iterators. Elements in a
152random access index are by default sorted according to their order of
153insertion: this means that new elements inserted through a different index
154of the <code>multi_index_container</code> are appended to the end of the
155random access index; additionally, facilities are provided
156for further rearrangement of the elements. The public interface of
157random access indices includes that of
158<a href="seq_indices.html">sequenced indices</a>, with differences in
159the complexity of the operations, plus extra operations for
160positional access (<code>operator[]</code> and <code>at()</code>) and
161for capacity handling.
162Iterators (including to the end of the index) and pointers and references to an element
163remain valid during the lifetime of the associated container (which can change
164upon swapping) regardless of the capacity status, or until the referred-to element
165is erased or extracted; pointers and references to an extracted element,
166but not so for iterators, become valid again once the element is re-inserted.
167</p>
168
169<p>
170Except where noted or if the corresponding interface does not exist, random access
171indices verify the same container requirements as <code>std::vector</code>
172plus the requirements for <code>std::list</code> specific list operations at
173<b>[list.ops]</b>. Some of the most important differences with respect to
174<code>std::vector</code> are:
175<ul>
176  <li>Random access indices do not provide memory contiguity, and hence do not
177    have <code>data</code> member functions.
178  </li>
179
180  <li>The complexity of some operations, notably insertion and deletion, differ
181    from those of <code>std::vector</code>.
182  </li>
183  <li>Unlike as in <code>std::vector</code>, insertions into a random access index
184    may fail due to clashings with other indices. This alters the semantics
185    of the operations provided with respect to their analogues in
186    <code>std::vector</code>.
187  </li>
188  <li>Elements in a random access index are not mutable, and can only be changed
189    in place by means of <a href="#replace"><code>replace</code></a> and
190	<a href="#modify"><code>modify</code></a> member functions.
191  </li>
192  <li><code>push_front</code> and <code>pop_front</code> are provided for
193    compatibility with sequenced indices, even though they take linear time to execute.
194  </li></ul>
195</p>
196
197<blockquote><pre>
198<span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
199
200<span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
201
202<span class=keyword>namespace</span> <span class=identifier>detail</span><span class=special>{</span>
203
204<span class=keyword>template</span><span class=special>&lt;</span><b>implementation defined: dependent on types Value, Allocator, TagList</b><span class=special>&gt;</span>
205<span class=keyword>class</span> <b>name is implementation defined</b>
206<span class=special>{</span>
207<span class=keyword>public</span><span class=special>:</span>
208  <span class=comment>// types:</span>
209
210  <span class=keyword>typedef</span> <span class=identifier>Value</span>                                      <span class=identifier>value_type</span><span class=special>;</span>
211  <span class=keyword>typedef</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuples</span><span class=special>::</span><span class=identifier>null_type</span>                   <span class=identifier>ctor_args</span><span class=special>;</span>
212  <span class=keyword>typedef</span> <span class=identifier>TagList</span>                                    <span class=identifier>tag_list</span><span class=special>;</span>
213  <span class=keyword>typedef</span> <span class=identifier>Allocator</span>                                  <span class=identifier>allocator_type</span><span class=special>;</span>
214  <span class=keyword>typedef</span> <span class=keyword>typename</span> <span class=identifier>allocator_type</span><span class=special>::</span><span class=identifier>reference</span>         <span class=identifier>reference</span><span class=special>;</span>
215  <span class=keyword>typedef</span> <span class=keyword>typename</span> <span class=identifier>allocator_type</span><span class=special>::</span><span class=identifier>const_reference</span>   <span class=identifier>const_reference</span><span class=special>;</span>
216  <span class=keyword>typedef</span> <b>implementation defined</b>                     <span class=identifier>iterator</span><span class=special>;</span>
217  <span class=keyword>typedef</span> <b>implementation defined</b>                     <span class=identifier>const_iterator</span><span class=special>;</span>
218  <span class=keyword>typedef</span> <b>implementation defined</b>                     <span class=identifier>size_type</span><span class=special>;</span>
219  <span class=keyword>typedef</span> <b>implementation defined</b>                     <span class=identifier>difference_type</span><span class=special>;</span>
220  <span class=keyword>typedef</span> <span class=keyword>typename</span> <span class=identifier>allocator_type</span><span class=special>::</span><span class=identifier>pointer</span>           <span class=identifier>pointer</span><span class=special>;</span>
221  <span class=keyword>typedef</span> <span class=keyword>typename</span> <span class=identifier>allocator_type</span><span class=special>::</span><span class=identifier>const_pointer</span>     <span class=identifier>const_pointer</span><span class=special>;</span>
222  <span class=keyword>typedef</span> <b>equivalent to
223    std::reverse_iterator&lt;iterator&gt;</b>                  <span class=identifier>reverse_iterator</span><span class=special>;</span>
224  <span class=keyword>typedef</span> <b>equivalent to
225    std::reverse_iterator&lt;const_iterator&gt;</b>            <span class=identifier>const_reverse_iterator</span><span class=special>;</span>
226  <span class=keyword>typedef</span> <b>same as owning container                   </b><span class=identifier>node_type</span><span class=special>;</span>
227  <span class=keyword>typedef</span> <b>following [container.insert.return] spec   </b><span class=identifier>insert_return_type</span><span class=special>;</span>
228
229  <span class=comment>// construct/copy/destroy:</span>
230
231  <b>index class name</b><span class=special>&amp;</span> <span class=keyword>operator</span><span class=special>=(</span><span class=keyword>const</span> <b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
232  <b>index class name</b><span class=special>&amp;</span> <span class=keyword>operator</span><span class=special>=(</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>initializer_list</span><span class=special>&lt;</span><span class=identifier>value_type</span><span class=special>&gt;</span> <span class=identifier>list</span><span class=special>);</span>
233
234  <span class=keyword>template</span> <span class=special>&lt;</span><span class=keyword>class</span> <span class=identifier>InputIterator</span><span class=special>&gt;</span>
235  <span class=keyword>void</span> <span class=identifier>assign</span><span class=special>(</span><span class=identifier>InputIterator</span> <span class=identifier>first</span><span class=special>,</span><span class=identifier>InputIterator</span> <span class=identifier>last</span><span class=special>);</span>
236  <span class=keyword>void</span> <span class=identifier>assign</span><span class=special>(</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>initializer_list</span><span class=special>&lt;</span><span class=identifier>value_type</span><span class=special>&gt;</span> <span class=identifier>list</span><span class=special>)</span>
237  <span class=keyword>void</span> <span class=identifier>assign</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>n</span><span class=special>,</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>value</span><span class=special>);</span>
238
239  <span class=identifier>allocator_type</span> <span class=identifier>get_allocator</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
240
241  <span class=comment>// iterators:</span>
242
243  <span class=identifier>iterator</span>               <span class=identifier>begin</span><span class=special>()</span><span class=keyword>noexcept</span><span class=special>;</span>
244  <span class=identifier>const_iterator</span>         <span class=identifier>begin</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
245  <span class=identifier>iterator</span>               <span class=identifier>end</span><span class=special>()</span><span class=keyword>noexcept</span><span class=special>;</span>
246  <span class=identifier>const_iterator</span>         <span class=identifier>end</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
247  <span class=identifier>reverse_iterator</span>       <span class=identifier>rbegin</span><span class=special>()</span><span class=keyword>noexcept</span><span class=special>;</span>
248  <span class=identifier>const_reverse_iterator</span> <span class=identifier>rbegin</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
249  <span class=identifier>reverse_iterator</span>       <span class=identifier>rend</span><span class=special>()</span><span class=keyword>noexcept</span><span class=special>;</span>
250  <span class=identifier>const_reverse_iterator</span> <span class=identifier>rend</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
251  <span class=identifier>const_iterator</span>         <span class=identifier>cbegin</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
252  <span class=identifier>const_iterator</span>         <span class=identifier>cend</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
253  <span class=identifier>const_reverse_iterator</span> <span class=identifier>crbegin</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
254  <span class=identifier>const_reverse_iterator</span> <span class=identifier>crend</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
255
256  <span class=identifier>iterator</span>       <span class=identifier>iterator_to</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
257  <span class=identifier>const_iterator</span> <span class=identifier>iterator_to</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
258
259  <span class=comment>// capacity:</span>
260
261  <span class=keyword>bool</span>      <span class=identifier>empty</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
262  <span class=identifier>size_type</span> <span class=identifier>size</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
263  <span class=identifier>size_type</span> <span class=identifier>max_size</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
264  <span class=identifier>size_type</span> <span class=identifier>capacity</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
265  <span class=keyword>void</span>      <span class=identifier>reserve</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>m</span><span class=special>);</span>
266  <span class=keyword>void</span>      <span class=identifier>shrink_to_fit</span><span class=special>();</span>
267
268  <span class=keyword>void</span> <span class=identifier>resize</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>n</span><span class=special>);</span>
269  <span class=keyword>void</span> <span class=identifier>resize</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>n</span><span class=special>,</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
270
271  <span class=comment>// access:</span>
272
273  <span class=identifier>const_reference</span> <span class=keyword>operator</span><span class=special>[](</span><span class=identifier>size_type</span> <span class=identifier>n</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
274  <span class=identifier>const_reference</span> <span class=identifier>at</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>n</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
275  <span class=identifier>const_reference</span> <span class=identifier>front</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
276  <span class=identifier>const_reference</span> <span class=identifier>back</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
277
278  <span class=comment>// modifiers:</span>
279
280  <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Args</span><span class=special>&gt;</span>
281  <span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>iterator</span><span class=special>,</span><span class=keyword>bool</span><span class=special>&gt;</span> <span class=identifier>emplace_front</span><span class=special>(</span><span class=identifier>Args</span><span class=special>&amp;&amp;...</span> <span class=identifier>args</span><span class=special>);</span>
282  <span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>iterator</span><span class=special>,</span><span class=keyword>bool</span><span class=special>&gt;</span> <span class=identifier>push_front</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
283  <span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>iterator</span><span class=special>,</span><span class=keyword>bool</span><span class=special>&gt;</span> <span class=identifier>push_front</span><span class=special>(</span><span class=identifier>value_type</span><span class=special>&amp;&amp;</span> <span class=identifier>x</span><span class=special>);</span>
284  <span class=keyword>void</span>                     <span class=identifier>pop_front</span><span class=special>();</span>
285
286  <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Args</span><span class=special>&gt;</span>
287  <span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>iterator</span><span class=special>,</span><span class=keyword>bool</span><span class=special>&gt;</span> <span class=identifier>emplace_back</span><span class=special>(</span><span class=identifier>Args</span><span class=special>&amp;&amp;...</span> <span class=identifier>args</span><span class=special>);</span>
288  <span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>iterator</span><span class=special>,</span><span class=keyword>bool</span><span class=special>&gt;</span> <span class=identifier>push_back</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
289  <span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>iterator</span><span class=special>,</span><span class=keyword>bool</span><span class=special>&gt;</span> <span class=identifier>push_back</span><span class=special>(</span><span class=identifier>value_type</span><span class=special>&amp;&amp;</span> <span class=identifier>x</span><span class=special>);</span>
290  <span class=keyword>void</span>                     <span class=identifier>pop_back</span><span class=special>();</span>
291
292  <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Args</span><span class=special>&gt;</span>
293  <span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>iterator</span><span class=special>,</span><span class=keyword>bool</span><span class=special>&gt;</span> <span class=identifier>emplace</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>Args</span><span class=special>&amp;&amp;...</span> <span class=identifier>args</span><span class=special>);</span>
294  <span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>iterator</span><span class=special>,</span><span class=keyword>bool</span><span class=special>&gt;</span> <span class=identifier>insert</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
295  <span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>iterator</span><span class=special>,</span><span class=keyword>bool</span><span class=special>&gt;</span> <span class=identifier>insert</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>value_type</span><span class=special>&amp;&amp;</span> <span class=identifier>x</span><span class=special>);</span>
296  <span class=keyword>void</span> <span class=identifier>insert</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>size_type</span> <span class=identifier>m</span><span class=special>,</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
297  <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>InputIterator</span><span class=special>&gt;</span>
298  <span class=keyword>void</span> <span class=identifier>insert</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>InputIterator</span> <span class=identifier>first</span><span class=special>,</span><span class=identifier>InputIterator</span> <span class=identifier>last</span><span class=special>);</span>
299  <span class=keyword>void</span> <span class=identifier>insert</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>initializer_list</span><span class=special>&lt;</span><span class=identifier>value_type</span><span class=special>&gt;</span> <span class=identifier>list</span><span class=special>);</span>
300  <span class=identifier>insert_return_type</span> <span class=identifier>insert</span><span class=special>(</span><span class=identifier>const_iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>node_type</span><span class=special>&amp;&amp;</span> <span class=identifier>nh</span><span class=special>);</span>
301
302  <span class=identifier>node_type</span> <span class=identifier>extract</span><span class=special>(</span><span class=identifier>const_iterator</span> <span class=identifier>position</span><span class=special>);</span>
303
304  <span class=identifier>iterator</span> <span class=identifier>erase</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>);</span>
305  <span class=identifier>iterator</span> <span class=identifier>erase</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>first</span><span class=special>,</span><span class=identifier>iterator</span> <span class=identifier>last</span><span class=special>);</span>
306
307  <span class=keyword>bool</span> <span class=identifier>replace</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
308  <span class=keyword>bool</span> <span class=identifier>replace</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>value_type</span><span class=special>&amp;&amp;</span> <span class=identifier>x</span><span class=special>);</span>
309  <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>Modifier</span><span class=special>&gt;</span> <span class=keyword>bool</span> <span class=identifier>modify</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>Modifier</span> <span class=identifier>mod</span><span class=special>);</span>
310  <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>Modifier</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Rollback</span><span class=special>&gt;</span>
311  <span class=keyword>bool</span> <span class=identifier>modify</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>Modifier</span> <span class=identifier>mod</span><span class=special>,</span><span class=identifier>Rollback</span> <span class=identifier>back</span><span class=special>);</span>
312
313  <span class=keyword>void</span> <span class=identifier>swap</span><span class=special>(</span><b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
314
315  <span class=keyword>void</span> <span class=identifier>clear</span><span class=special>()</span><span class=keyword>noexcept</span><span class=special>;</span>
316
317  <span class=comment>// list operations:</span>
318
319  <span class=keyword>void</span> <span class=identifier>splice</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
320  <span class=keyword>void</span> <span class=identifier>splice</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span><span class=identifier>iterator</span> <span class=identifier>i</span><span class=special>);</span>
321  <span class=keyword>void</span> <span class=identifier>splice</span><span class=special>(</span>
322    <span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span><span class=identifier>iterator</span> <span class=identifier>first</span><span class=special>,</span><span class=identifier>iterator</span> <span class=identifier>last</span><span class=special>);</span>
323
324  <span class=keyword>void</span> <span class=identifier>remove</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>value</span><span class=special>);</span>
325  <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>Predicate</span><span class=special>&gt;</span> <span class=keyword>void</span> <span class=identifier>remove_if</span><span class=special>(</span><span class=identifier>Predicate</span> <span class=identifier>pred</span><span class=special>);</span>
326
327  <span class=keyword>void</span> <span class=identifier>unique</span><span class=special>();</span>
328  <span class=keyword>template</span> <span class=special>&lt;</span><span class=keyword>class</span> <span class=identifier>BinaryPredicate</span><span class=special>&gt;</span>
329  <span class=keyword>void</span> <span class=identifier>unique</span><span class=special>(</span><span class=identifier>BinaryPredicate</span> <span class=identifier>binary_pred</span><span class=special>);</span>
330
331  <span class=keyword>void</span> <span class=identifier>merge</span><span class=special>(</span><b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
332  <span class=keyword>template</span> <span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>Compare</span><span class=special>&gt;</span> <span class=keyword>void</span> <span class=identifier>merge</span><span class=special>(</span><b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span><span class=identifier>Compare</span> <span class=identifier>comp</span><span class=special>);</span>
333
334  <span class=keyword>void</span> <span class=identifier>sort</span><span class=special>();</span>
335  <span class=keyword>template</span> <span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>Compare</span><span class=special>&gt;</span> <span class=keyword>void</span> <span class=identifier>sort</span><span class=special>(</span><span class=identifier>Compare</span> <span class=identifier>comp</span><span class=special>);</span>
336
337  <span class=keyword>void</span> <span class=identifier>reverse</span><span class=special>()</span><span class=keyword>noexcept</span><span class=special>;</span>
338
339  <span class=comment>// rearrange operations:</span>
340
341  <span class=keyword>void</span> <span class=identifier>relocate</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>iterator</span> <span class=identifier>i</span><span class=special>);</span>
342  <span class=keyword>void</span> <span class=identifier>relocate</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>iterator</span> <span class=identifier>first</span><span class=special>,</span><span class=identifier>iterator</span> <span class=identifier>last</span><span class=special>);</span>
343  <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>InputIterator</span><span class=special>&gt;</span> <span class=keyword>void</span> <span class=identifier>rearrange</span><span class=special>(</span><span class=identifier>InputIterator</span> <span class=identifier>first</span><span class=special>);</span>
344<span class=special>}</span>
345
346<span class=comment>// index comparison:</span>
347
348<span class=keyword>template</span><span class=special>&lt;</span><b>arg set 1</b><span class=special>,</span><b>arg set 2</b><span class=special>&gt;</span>
349<span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>==(</span>
350  <span class=keyword>const</span> <b>index class name</b><span class=special>&lt;</span><b>arg set 1</b><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
351  <span class=keyword>const</span> <b>index class name</b><span class=special>&lt;</span><b>arg set 2</b><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span>
352<span class=special>{</span>
353  <span class=keyword>return</span> <span class=identifier>x</span><span class=special>.</span><span class=identifier>size</span><span class=special>()==</span><span class=identifier>y</span><span class=special>.</span><span class=identifier>size</span><span class=special>()&amp;&amp;</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>equal</span><span class=special>(</span><span class=identifier>x</span><span class=special>.</span><span class=identifier>begin</span><span class=special>(),</span><span class=identifier>x</span><span class=special>.</span><span class=identifier>end</span><span class=special>(),</span><span class=identifier>y</span><span class=special>.</span><span class=identifier>begin</span><span class=special>());</span>
354<span class=special>}</span>
355
356<span class=keyword>template</span><span class=special>&lt;</span><b>arg set 1</b><span class=special>,</span><b>arg set 2</b><span class=special>&gt;</span>
357<span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>&lt;(</span>
358  <span class=keyword>const</span> <b>index class name</b><span class=special>&lt;</span><b>arg set 1</b><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
359  <span class=keyword>const</span> <b>index class name</b><span class=special>&lt;</span><b>arg set 2</b><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span>
360<span class=special>{</span>
361  <span class=keyword>return</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>lexicographical_compare</span><span class=special>(</span><span class=identifier>x</span><span class=special>.</span><span class=identifier>begin</span><span class=special>(),</span><span class=identifier>x</span><span class=special>.</span><span class=identifier>end</span><span class=special>(),</span><span class=identifier>y</span><span class=special>.</span><span class=identifier>begin</span><span class=special>(),</span><span class=identifier>y</span><span class=special>.</span><span class=identifier>end</span><span class=special>());</span>
362<span class=special>}</span>
363
364<span class=keyword>template</span><span class=special>&lt;</span><b>arg set 1</b><span class=special>,</span><b>arg set 2</b><span class=special>&gt;</span>
365<span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>!=(</span>
366  <span class=keyword>const</span> <b>index class name</b><span class=special>&lt;</span><b>arg set 1</b><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
367  <span class=keyword>const</span> <b>index class name</b><span class=special>&lt;</span><b>arg set 2</b><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span>
368<span class=special>{</span>
369  <span class=keyword>return</span> <span class=special>!(</span><span class=identifier>x</span><span class=special>==</span><span class=identifier>y</span><span class=special>);</span>
370<span class=special>}</span>
371
372<span class=keyword>template</span><span class=special>&lt;</span><b>arg set 1</b><span class=special>,</span><b>arg set 2</b><span class=special>&gt;</span>
373<span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>&gt;(</span>
374  <span class=keyword>const</span> <b>index class name</b><span class=special>&lt;</span><b>arg set 1</b><span class=special>&gt;&amp;</span> <span class=identifier>x</span>
375  <span class=special>,</span><span class=keyword>const</span> <b>index class name</b><span class=special>&lt;</span><b>arg set 2</b><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span>
376<span class=special>{</span>
377  <span class=keyword>return</span> <span class=identifier>y</span><span class=special>&lt;</span><span class=identifier>x</span><span class=special>;</span>
378<span class=special>}</span>
379
380<span class=keyword>template</span><span class=special>&lt;</span><b>arg set 1</b><span class=special>,</span><b>arg set 2</b><span class=special>&gt;</span>
381<span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>&gt;=(</span>
382  <span class=keyword>const</span> <b>index class name</b><span class=special>&lt;</span><b>arg set 1</b><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
383  <span class=keyword>const</span> <b>index class name</b><span class=special>&lt;</span><b>arg set 2</b><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span>
384<span class=special>{</span>
385  <span class=keyword>return</span> <span class=special>!(</span><span class=identifier>x</span><span class=special>&lt;</span><span class=identifier>y</span><span class=special>);</span>
386<span class=special>}</span>
387
388<span class=keyword>template</span><span class=special>&lt;</span><b>arg set 1</b><span class=special>,</span><b>arg set 2</b><span class=special>&gt;</span>
389<span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>&lt;=(</span>
390  <span class=keyword>const</span> <b>index class name</b><span class=special>&lt;</span><b>arg set 1</b><span class=special>&gt;&amp;</span> <span class=identifier>x</span><span class=special>,</span>
391  <span class=keyword>const</span> <b>index class name</b><span class=special>&lt;</span><b>arg set 2</b><span class=special>&gt;&amp;</span> <span class=identifier>y</span><span class=special>)</span>
392<span class=special>{</span>
393  <span class=keyword>return</span> <span class=special>!(</span><span class=identifier>x</span><span class=special>&gt;</span><span class=identifier>y</span><span class=special>);</span>
394<span class=special>}</span>
395
396<span class=comment>// index specialized algorithms:</span>
397
398<span class=keyword>template</span><span class=special>&lt;</span><b>implementation defined</b><span class=special>&gt;</span>
399<span class=keyword>void</span> <span class=identifier>swap</span><span class=special>(</span><b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span><b>index class name</b><span class=special>&amp;</span> <span class=identifier>y</span><span class=special>);</span>
400
401<span class=special>}</span> <span class=comment>// namespace boost::multi_index::detail</span>
402
403<span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
404
405<span class=special>}</span> <span class=comment>// namespace boost</span>
406</pre></blockquote>
407
408<h4><a name="complexity_signature">Complexity signature</a></h4>
409
410<p>
411Here and in the descriptions of operations of random access indices, we
412adopt the scheme outlined in the
413<a href="indices.html#complexity_signature">complexity signature
414section</a>. The complexity signature of random access indices is:
415<ul>
416  <li>copying: <code>c(n)=n*log(n)</code>,</li>
417  <li>insertion: <code>i(n)=1</code> (amortized constant),</li>
418  <li>hinted insertion: <code>h(n)=1</code> (amortized constant),</li>
419  <li>deletion: <code>d(n)=m</code>, where <code>m</code> is the distance
420    from the deleted element to the end of the sequence,</li>
421  <li>replacement: <code>r(n)=1</code> (constant),</li>
422  <li>modifying: <code>m(n)=1</code> (constant).</li>
423</ul>
424The following expressions are also used as a convenience for writing down some
425of the complexity formulas:
426</p>
427
428<blockquote>
429<code>shl(a,b)</code> = <code>a+b</code> if a is nonzero, <code>0</code> otherwise.<br>
430<code>rel(a,b,c)</code> = if <code>a&lt;b</code>, <code>c-a</code>, else <code>a-b</code>,
431</blockquote>
432
433<p>
434(<code>shl</code> and <code>rel</code> stand for <i>shift left</i> and
435<i>relocate</i>, respectively.)
436</p>
437
438<h4><a name="instantiation_types">Instantiation types</a></h4>
439
440<p>Random access indices are instantiated internally to <code>multi_index_container</code>
441and specified by means of <a href="indices.html#indexed_by">
442<code>indexed_by</code></a> with the <a href="#random_access"><code>random_access</code></a>
443index specifier. Instantiations are dependent on the following types:
444<ul>
445  <li><code>Value</code> from <code>multi_index_container</code>,</li>
446  <li><code>Allocator</code> from <code>multi_index_container</code>,</li>
447  <li><code>TagList</code> from the index specifier (if provided, otherwise <code>tag&lt;&gt;</code> is assumed).</li>
448</ul>
449<code>TagList</code> must be an instantiation of
450<a href="indices.html#tag"><code>tag</code></a>.
451</p>
452
453<h4><a name="constructors">Constructors, copy and assignment</a></h4>
454
455<p>
456As explained in the <a href="indices.html#index_concepts">index
457concepts section</a>, indices do not have public constructors or destructors.
458Assignment, on the other hand, is provided.
459</p>
460
461<code><b>index class name</b>&amp; operator=(const <b>index class name</b>&amp; x);</code>
462
463<blockquote>
464<b>Effects:</b>
465<blockquote><pre>
466<span class=identifier>a</span><span class=special>=</span><span class=identifier>b</span><span class=special>;</span>
467</pre></blockquote>
468where <code>a</code> and <code>b</code> are the <code>multi_index_container</code>
469objects to which <code>*this</code> and <code>x</code> belong, respectively.<br>
470<b>Returns:</b> <code>*this</code>.<br>
471</blockquote>
472
473<code><b>index class name</b>&amp; operator=(std::initializer_list&lt;value_type&gt; list);</code>
474
475<blockquote>
476<b>Effects:</b>
477<blockquote><pre>
478<span class=identifier>a</span><span class=special>=</span><span class=identifier>list</span><span class=special>;</span>
479</pre></blockquote>
480where <code>a</code> is the <code>multi_index_container</code>
481object to which <code>*this</code> belongs.<br>
482<b>Returns:</b> <code>*this</code>.<br>
483</blockquote>
484
485<code>template &lt;class InputIterator><br>
486void assign(InputIterator first,InputIterator last);</code>
487
488<blockquote>
489<b>Effects:</b>
490<blockquote><pre>
491<span class=identifier>clear</span><span class=special>();</span>
492<span class=identifier>insert</span><span class=special>(</span><span class=identifier>end</span><span class=special>(),</span><span class=identifier>first</span><span class=special>,</span><span class=identifier>last</span><span class=special>);</span>
493</pre></blockquote>
494</blockquote>
495
496<code>void assign(std::initializer_list&lt;value_type&gt; list);</code>
497
498<blockquote>
499<b>Effects:</b>
500<blockquote><pre>
501<span class=identifier>assign</span><span class=special>(</span><span class=identifier>list</span><span class=special>.</span><span class=identifier>begin</span><span class=special>(),</span><span class=identifier>list</span><span class=special>.</span><span class=identifier>end</span><span class=special>());</span>
502</pre></blockquote>
503</blockquote>
504
505<code>void assign(size_type n,const value_type&amp; value);</code>
506
507<blockquote>
508<b>Effects:</b>
509<blockquote><pre>
510<span class=identifier>clear</span><span class=special>();</span>
511<span class=keyword>for</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>i</span><span class=special>=</span><span class=number>0</span><span class=special>;</span><span class=identifier>i</span><span class=special>&lt;</span><span class=identifier>n</span><span class=special>;++</span><span class=identifier>n</span><span class=special>)</span><span class=identifier>push_back</span><span class=special>(</span><span class=identifier>v</span><span class=special>);</span>
512</pre></blockquote>
513</blockquote>
514
515<h4><a name="iterators">Iterators</a></h4>
516
517<code>iterator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator_to(const value_type&amp; x);<br>
518const_iterator iterator_to(const value_type&amp; x)const;</code>
519
520<blockquote>
521<b>Requires:</b> <code>x</code> is a reference to an element of the container.<br>
522<b>Returns:</b> An iterator to <code>x</code>.<br>
523<b>Complexity:</b> Constant.<br>
524<b>Exception safety:</b> <code>nothrow</code>.<br>
525</blockquote>
526
527<h4><a name="capacity">Capacity operations</a></h4>
528
529<a name="capacity_memfun"><code>size_type capacity()const noexcept;</code></a>
530
531<blockquote>
532<b>Returns:</b> The total number of elements <code>c</code> such that, when
533<code>size()&lt;c</code>, back insertions happen in constant time (the
534general case as described by
535<a href="#complexity_signature"><code>i(n)</code></a> is <i>amortized</i>
536constant time.)<br>
537<b>Note:</b> Validity of iterators and references to elements
538is preserved in all insertions, regardless of the capacity status.
539</blockquote>
540
541<a name="reserve"><code>void reserve(size_type m);</code></a>
542
543<blockquote>
544<b>Effects:</b> If the previous value of <code>capacity()</code>
545was greater than or equal to <code>m</code>, nothing is done;
546otherwise, the internal capacity is changed so that
547<code>capacity()>=m</code>.<br>
548<b>Complexity:</b> If the capacity is not changed, constant;
549otherwise <code>O(n)</code>.<br>
550<b>Exception safety:</b> If the capacity is not changed, <code>nothrow</code>;
551otherwise, strong.<br>
552</blockquote>
553
554<code>void shrink_to_fit();</code>
555
556<blockquote>
557<b>Effects:</b> Reduces <code>capacity()</code> to <code>size()</code>.<br>
558<b>Complexity:</b> If the capacity is not changed, constant;
559otherwise <code>O(n)</code>.<br>
560<b>Exception safety:</b> If the capacity is not changed, <code>nothrow</code>;
561otherwise, strong.<br>
562</blockquote>
563
564<code>void resize(size_type n);<br>
565void resize(size_type n,const value_type&amp; x);</code>
566
567<blockquote>
568<b>Requires (first version):</b> <code>value_type</code> is <code>DefaultInsertable</code>
569into <code>multi_index_container</code>.<br>
570<b>Requires (second version):</b> <code>value_type</code> is <code>CopyInsertable</code>
571into <code>multi_index_container</code>.<br>
572<b>Effects:</b> If <code>size()&lt;n</code>, tries to append <code>n-size()</code> default-inserted
573elements (first version) or copies of <code>x</code> (second version) at the end of
574the index. If <code>n&lt;size()</code>, erases the last <code>size()-n</code> elements.<br>
575<b>Note:</b> If an expansion is requested, the size of the index is not guaranteed
576to be <code>n</code> after this operation (other indices may ban insertions.)
577</blockquote>
578
579<h4><a name="modifiers">Modifiers</a></h4>
580
581<code>template&lt;typename... Args&gt;<br>
582std::pair&lt;iterator,bool&gt; emplace_front(Args&amp;&amp;... args);</code>
583
584<blockquote>
585<b>Effects:</b>
586<blockquote><pre>
587<span class=identifier>emplace</span><span class=special>(</span><span class=identifier>begin</span><span class=special>(),</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>forward</span><span class=special>&lt;</span><span class=identifier>Args</span><span class=special>&gt;(</span><span class=identifier>args</span><span class=special>)...);</span>
588</pre></blockquote>
589<b>Returns:</b> The return value is a pair <code>p</code>. <code>p.second</code>
590is <code>true</code> if and only if insertion took place. On successful
591insertion, <code>p.first</code> points to the element inserted; otherwise,
592<code>p.first</code> points to an element that caused the insertion to be banned.
593Note that more than one element can be causing insertion not to be allowed.<br>
594</blockquote>
595
596<code>std::pair&lt;iterator,bool> push_front(const value_type&amp; x);</code><br>
597<code>std::pair&lt;iterator,bool> push_front(value_type&amp;&amp; x);</code>
598
599<blockquote>
600<b>Effects:</b>
601<blockquote><pre>
602<span class=identifier>insert</span><span class=special>(</span><span class=identifier>begin</span><span class=special>(),</span><span class=identifier>x</span><span class=special>);</span>            <span class=comment>// lvalue ref version</span>
603<span class=identifier>insert</span><span class=special>(</span><span class=identifier>begin</span><span class=special>(),</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>move</span><span class=special>(</span><span class=identifier>x</span><span class=special>));</span> <span class=comment>// rvalue ref version</span>
604</pre></blockquote>
605<b>Returns:</b> The return value is a pair <code>p</code>. <code>p.second</code>
606is <code>true</code> if and only if insertion took place. On successful
607insertion, <code>p.first</code> points to the element inserted; otherwise,
608<code>p.first</code> points to an element that caused the insertion to be banned.
609Note that more than one element can be causing insertion not to be allowed.<br>
610</blockquote>
611
612<code>template&lt;typename... Args&gt;<br>
613std::pair&lt;iterator,bool&gt; emplace_back(Args&amp;&amp;... args);</code>
614
615<blockquote>
616<b>Effects:</b>
617<blockquote><pre>
618<span class=identifier>emplace</span><span class=special>(</span><span class=identifier>end</span><span class=special>(),</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>forward</span><span class=special>&lt;</span><span class=identifier>Args</span><span class=special>&gt;(</span><span class=identifier>args</span><span class=special>)...);</span>
619</pre></blockquote>
620<b>Returns:</b> The return value is a pair <code>p</code>. <code>p.second</code>
621is <code>true</code> if and only if insertion took place. On successful
622insertion, <code>p.first</code> points to the element inserted; otherwise,
623<code>p.first</code> points to an element that caused the insertion to be banned.
624Note that more than one element can be causing insertion not to be allowed.<br>
625</blockquote>
626
627<code>std::pair&lt;iterator,bool> push_back(const value_type&amp; x);</code><br>
628<code>std::pair&lt;iterator,bool> push_back(value_type&amp;&amp; x);</code>
629
630<blockquote>
631<b>Effects:</b>
632<blockquote><pre>
633<span class=identifier>insert</span><span class=special>(</span><span class=identifier>end</span><span class=special>(),</span><span class=identifier>x</span><span class=special>);</span>            <span class=comment>// lvalue ref version</span>
634<span class=identifier>insert</span><span class=special>(</span><span class=identifier>end</span><span class=special>(),</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>move</span><span class=special>(</span><span class=identifier>x</span><span class=special>));</span> <span class=comment>// rvalue ref version</span>
635</pre></blockquote>
636<b>Returns:</b> The return value is a pair <code>p</code>. <code>p.second</code>
637is <code>true</code> if and only if insertion took place. On successful
638insertion, <code>p.first</code> points to the element inserted; otherwise,
639<code>p.first</code> points to an element that caused the insertion to be banned.
640Note that more than one element can be causing insertion not to be allowed.<br>
641</blockquote>
642
643<code>template&lt;typename... Args&gt;<br>
644 std::pair&lt;iterator,bool&gt; emplace(iterator position,Args&amp;&amp;... args);</code>
645
646<blockquote>
647<b>Requires:</b> <code>value_type</code> is <code>EmplaceConstructible</code>
648into <code>multi_index_container</code> from <code>args</code>.<br>
649<b>Effects:</b> Inserts a <code>value_type</code> object constructed with
650<code>std::forward&lt;Args&gt;(args)...</code> before <code>position</code> if insertion
651is allowed by all other indices of the <code>multi_index_container</code>.<br>
652<b>Returns:</b> The return value is a pair <code>p</code>. <code>p.second</code>
653is <code>true</code> if and only if insertion took place. On successful insertion,
654<code>p.first</code> points to the element inserted; otherwise, <code>p.first</code>
655points to an element that caused the insertion to be banned. Note that more than
656one element can be causing insertion not to be allowed.<br>
657<b>Complexity:</b> <code>O(shl(end()-position,1) + I(n))</code>.<br>
658<b>Exception safety:</b> Strong.<br>
659</blockquote>
660
661<code>std::pair&lt;iterator,bool> insert(iterator position,const value_type&amp; x);</code><br>
662<code>std::pair&lt;iterator,bool> insert(iterator position,value_type&amp;&amp; x);</code>
663
664<blockquote>
665<b>Requires (first version):</b> <code>value_type</code> is <code>CopyInsertable</code>
666into <code>multi_index_container</code>.
667<code>position</code> is a valid iterator of the index.<br>
668<b>Requires (second version):</b> <code>value_type</code> is <code>MoveInsertable</code>
669into <code>multi_index_container</code>.
670<code>position</code> is a valid iterator of the index.<br>
671<b>Effects:</b> Inserts <code>x</code> before <code>position</code> if insertion
672is allowed by all other indices of the <code>multi_index_container</code>.<br>
673<b>Returns:</b> The return value is a pair <code>p</code>. <code>p.second</code>
674is <code>true</code> if and only if insertion took place. On successful
675insertion, <code>p.first</code> points to the element inserted; otherwise,
676<code>p.first</code> points to an element that caused the insertion to be banned.
677Note that more than one element can be causing insertion not to be allowed.<br>
678<b>Complexity:</b> <code>O(shl(end()-position,1) + I(n))</code>.<br>
679<b>Exception safety:</b> Strong.
680</blockquote>
681
682<code>void insert(iterator position,size_type m,const value_type&amp; x);</code>
683
684<blockquote>
685<b>Requires:</b> <code>position</code> is a valid iterator of the index.<br>
686<b>Effects:</b>
687<blockquote><pre>
688<span class=keyword>for</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>i</span><span class=special>=</span><span class=number>0</span><span class=special>;</span><span class=identifier>i</span><span class=special>&lt;</span><span class=identifier>m</span><span class=special>;++</span><span class=identifier>i</span><span class=special>)</span><span class=identifier>insert</span><span class=special>(</span><span class=identifier>position</span><span class=special>,</span><span class=identifier>x</span><span class=special>);</span>
689</pre></blockquote>
690<b>Complexity:</b> <code>O(shl(end()-position,m) + m*I(n+m))</code>.
691</blockquote>
692
693<code>template&lt;typename InputIterator><br>
694void insert(iterator position,InputIterator first,InputIterator last);</code>
695
696<blockquote>
697<b>Requires:</b> <code>position</code> is a valid iterator of the index.
698<code>InputIterator</code> is an input iterator.
699<code>value_type</code> is
700<code>EmplaceConstructible</code> into
701<code>multi_index_container</code> from <code>*first</code>.
702<code>first</code> and <code>last</code> are not iterators into any
703index of the <code>multi_index_container</code> to which this index belongs.
704<code>last</code> is reachable from <code>first</code>.<br>
705<b>Effects:</b>
706For each element of [<code>first</code>, <code>last</code>), in this
707order, inserts it before <code>position</code> if insertion is allowed by all
708other indices of the <code>multi_index_container</code>.<br>
709<b>Complexity:</b> <code>O(shl(end()-position,m) + m*I(n+m))</code>,
710where <code>m</code> is the number of elements in
711[<code>first</code>,<code>last</code>).<br>
712<b>Exception safety:</b> Basic.
713</blockquote>
714
715<code>void insert(iterator position,std::initializer_list&lt;value_type&gt; list);</code>
716
717<blockquote>
718<b>Effects:</b>
719<blockquote><pre>
720<span class=identifier>insert</span><span class=special>(</span><span class=identifier>position</span><span class=special>,</span><span class=identifier>list</span><span class=special>.</span><span class=identifier>begin</span><span class=special>(),</span><span class=identifier>list</span><span class=special>.</span><span class=identifier>end</span><span class=special>());</span>
721</pre></blockquote>
722</blockquote>
723
724<code>insert_return_type insert(const_iterator position,node_type&amp;&amp; nh);</code>
725
726<blockquote>
727<b>Requires:</b> <code>nh.empty() || get_allocator()==nh.get_allocator()</code>.<br>
728<b>Effects:</b> Does nothing if <code>nh</code> is empty; otherwise,
729inserts the node owned by <code>nh</code> before <code>position</code> if insertion
730is allowed by all other indices of the <code>multi_index_container</code>.<br>
731<b>Postconditions:</b> <code>nh</code> is empty.<br>
732<b>Returns:</b> A value <code>p</code> of type <code>insert_return_type</code>.
733If <code>nh</code> is empty, <code>p.position</code> is <code>end()</code>,
734<code>p.inserted</code> is <code>false</code> and <code>p.node</code> is empty;
735on successful insertion, <code>p.position</code> points to the element inserted,
736<code>p.inserted</code> is <code>true</code> and <code>p.node</code>
737is empty;
738if the insertion failed, <code>p.position</code> points to an element that caused
739the insertion to be banned, <code>p.inserted</code> is <code>false</code> and
740<code>p.node</code> owns the original node.
741Note that more than one element can be causing insertion not to be allowed.<br>
742<b>Complexity:</b> <code>O(shl(end()-position,1) + I(n))</code>.<br>
743<b>Exception safety:</b> Strong. If an exception
744is thrown, <code>nh</code> is not changed.<br>
745</blockquote>
746
747<code>node_type extract(const_iterator position);</code>
748
749<blockquote>
750<b>Requires:</b> <code>position</code> is a valid dereferenceable iterator
751of the index.<br>
752<b>Effects:</b> Extracts the node of the element pointed to by <code>position</code>.<br>
753<b>Returns:</b> A node handle owning the extracted node.<br>
754<b>Complexity:</b> <code>O(D(n))</code>.<br>
755<b>Exception safety:</b> <code>nothrow</code>.<br>
756</blockquote>
757
758<code>iterator erase(iterator position);</code>
759
760<blockquote>
761<b>Requires:</b> <code>position</code> is a valid dereferenceable iterator
762of the index.<br>
763<b>Effects:</b> Deletes the element pointed to by <code>position</code>.<br>
764<b>Returns:</b> An iterator pointing to the element immediately following
765the one that was deleted, or <code>end()</code>
766if no such element exists.<br>
767<b>Complexity:</b> <code>O(D(n))</code>.<br>
768<b>Exception safety:</b> <code>nothrow</code>.<br>
769</blockquote>
770
771<code>iterator erase(iterator first,iterator last);</code>
772
773<blockquote>
774<b>Requires:</b> [<code>first</code>,<code>last</code>) is a valid
775range of the index.<br>
776<b>Effects:</b> Deletes the elements in [<code>first</code>,<code>last</code>).<br>
777<b>Returns:</b> <code>last</code>.<br>
778<b>Complexity:</b> <code>O(m*D(n))</code>, where <code>m</code> is
779the number of elements in [<code>first</code>,<code>last</code>).<br>
780<b>Exception safety:</b> <code>nothrow</code>.<br>
781</blockquote>
782
783<a name="replace"><code>bool replace(iterator position,const value_type&amp; x);</code></a><br>
784<code>bool replace(iterator position,value_type&amp;&amp; x);</code>
785
786<blockquote>
787<b>Requires (first version):</b> <code>value_type</code> is <code>CopyAssignable</code>.
788<code>position</code> is a valid dereferenceable iterator of the index.<br>
789<b>Requires (second version):</b> <code>value_type</code> is <code>MoveAssignable</code>.
790<code>position</code> is a valid dereferenceable iterator of the index.<br>
791<b>Effects:</b> Assigns the value <code>x</code> to the element pointed
792to by <code>position</code> into the <code>multi_index_container</code> to which
793the index belongs if replacing is allowed by all other indices of the
794<code>multi_index_container</code>.<br>
795<b>Postconditions:</b> Validity of <code>position</code> is preserved
796in all cases.<br>
797<b>Returns:</b> <code>true</code> if the replacement took place,
798<code>false</code> otherwise.<br>
799<b>Complexity:</b> <code>O(R(n))</code>.<br>
800<b>Exception safety:</b> Strong. If an exception is thrown by some
801user-provided operation the <code>multi_index_container</code> to which the index
802belongs remains in its original state.
803</blockquote>
804
805<a name="modify">
806<code>template&lt;typename Modifier> bool modify(iterator position,Modifier mod);</code></a>
807
808<blockquote>
809<b>Requires:</b> <code>mod</code> is a unary function object
810accepting arguments of type
811<code>value_type&amp;</code>. <code>position</code> is a valid dereferenceable
812iterator of the index.
813The execution of <code>mod(e)</code>, where <code>e</code> is the element
814pointed to by <code>position</code>, does not invoke any operation of the
815<code>multi_index_container</code> after <code>e</code> is directly modified
816or, before modification, if the operation would invalidate <code>position</code>.<br>
817<b>Effects:</b> Calls <code>mod(e)</code> where <code>e</code> is the element
818pointed to by <code>position</code> and rearranges <code>*position</code> into
819all the indices of the <code>multi_index_container</code>. Rearrangement on sequenced
820indices does not change the position of the element with respect to the index;
821rearrangement on other indices may or might not succeed. If the rearrangement
822fails, the element is erased.<br>
823<b>Postconditions:</b> Validity of <code>position</code> is preserved if the
824operation succeeds.<br>
825<b>Returns:</b> <code>true</code> if the operation succeeded, <code>false</code>
826otherwise.<br>
827<b>Complexity:</b> <code>O(M(n))</code>.<br>
828<b>Exception safety:</b> Basic. If an exception is thrown by some
829user-provided operation (including <code>mod</code>), then
830the element pointed to by <code>position</code> is erased.
831</blockquote>
832
833<code>template&lt;typename Modifier,typename Rollback><br>
834bool modify(iterator position,Modifier mod,Rollback back);</code>
835
836<blockquote>
837<b>Requires:</b> <code>mod</code> and <code>back</code> are unary function
838objects accepting arguments of type
839<code>value_type&amp;</code>. <code>position</code> is a valid dereferenceable
840iterator of the index.
841The execution of <code>mod(e)</code>, where <code>e</code> is the element
842pointed to by <code>position</code>, does not invoke any operation of the
843<code>multi_index_container</code> after <code>e</code> is directly modified
844or, before modification, if the operation would invalidate <code>position</code>.
845<code>back(e)</code> does not invoke any operation of the
846<code>multi_index_container</code>.<br>
847<b>Effects:</b> Calls <code>mod(e)</code> where <code>e</code> is the element
848pointed to by <code>position</code> and tries to rearrange <code>*position</code> into
849all the indices of the <code>multi_index_container</code>. Rearrangement on sequenced
850indices does not change the position of the element with respect to the index;
851rearrangement on other indices may or might not succeed.
852If the rearrangement fails, <code>back(e)</code> is invoked: if the resulting value
853of <code>e</code> is consistent with its original position and constraints in all
854indices, the element is kept, otherwise it is erased.<br>
855<b>Postconditions:</b> Validity of <code>position</code> is preserved except if
856the element is erased under the conditions described below.<br>
857<b>Returns:</b> <code>true</code> if the operation succeeded, <code>false</code>
858otherwise.<br>
859<b>Complexity:</b> <code>O(M(n))</code>.<br>
860<b>Exception safety:</b> Strong, except if <code>mod</code> or <code>back</code> throw an
861exception or <code>back(e)</code> fails to properly restore the element or there is
862a throwing user-provided operation after invoking <code>back(e)</code>, in which cases
863the modified element is erased. If <code>back</code>
864throws inside the handling code executing after some other user-provided
865operation has thrown, it is the exception generated by <code>back</code> that
866is rethrown.
867</blockquote>
868
869<h4><a name="list_operations">List operations</a></h4>
870
871<p>
872Random access indices replicate the interface of sequenced indices, which
873in turn includes the list operations provided by <code>std::list</code>.
874The syntax and behavior of these operations exactly matches those
875of sequenced indices, but the associated complexity bounds differ in general.
876</p>
877
878<code>void splice(iterator position,<b>index class name</b>&amp; x);</code>
879
880<blockquote>
881<b>Requires:</b> <code>position</code> is a valid iterator of the index.
882<code>&amp;x!=this</code>.<br>
883<b>Effects:</b> Inserts the contents of <code>x</code> before <code>position</code>,
884in the same order as they were in <code>x</code>. Those elements successfully
885inserted are erased from <code>x</code>.<br>
886<b>Complexity:</b> <code>O(shl(end()-position,x.size()) + x.size()*I(n+x.size()) + x.size()*D(x.size()))</code>.<br>
887<b>Exception safety:</b> Basic.<br>
888</blockquote>
889
890<code>void splice(iterator position,<b>index class name</b>&amp; x,iterator i);</code>
891
892<blockquote>
893<b>Requires:</b> <code>position</code> is a valid iterator of the index.
894<code>i</code> is a valid dereferenceable iterator <code>x</code>.<br>
895<b>Effects:</b> Inserts the element pointed to by <code>i</code> before
896<code>position</code>: if insertion is successful, the element is erased from
897<code>x</code>. In the special case <code>&amp;x==this</code>, no copy or
898deletion is performed, and the operation is always successful. If
899<code>position==i</code>, no operation is performed.<br>
900<b>Postconditions:</b> If <code>&amp;x==this</code>, no iterator or reference
901is invalidated.<br>
902<b>Complexity:</b> If <code>&amp;x==this</code>, <code>O(rel(position,i,i+1))</code>;
903otherwise <code>O(shl(end()-position,1) + I(n) + D(n))</code>.<br>
904<b>Exception safety:</b> If <code>&amp;x==this</code>, <code>nothrow</code>;
905otherwise, strong.<br>
906</blockquote>
907
908<code>void splice(iterator position,<b>index class name&amp;</b> x,iterator first,iterator last);</code>
909
910<blockquote>
911<b>Requires:</b> <code>position</code> is a valid iterator of the index.
912<code>first</code> and <code>last</code> are valid iterators of <code>x</code>.
913<code>last</code> is reachable from <code>first</code>. <code>position</code>
914is not in the range [<code>first</code>,<code>last</code>).<br>
915<b>Effects:</b> For each element in the range [<code>first</code>,<code>last</code>),
916insertion is tried before <code>position</code>; if the operation is successful,
917the element is erased from <code>x</code>. In the special case
918<code>&amp;x==this</code>, no copy or deletion is performed, and insertions are
919always successful.<br>
920<b>Postconditions:</b> If <code>&amp;x==this</code>, no iterator or reference
921is invalidated.<br>
922<b>Complexity:</b> If <code>&amp;x==this</code>,
923<code>O(rel(position,first,last))</code>; otherwise
924<code>O(shl(end()-position,m) + m*I(n+m) + m*D(x.size()))</code>
925where <code>m</code> is the number of elements in [<code>first</code>,<code>last</code>).<br>
926<b>Exception safety:</b> If <code>&amp;x==this</code>, <code>nothrow</code>;
927otherwise, basic.<br>
928</blockquote>
929
930<code>void remove(const value_type&amp; value);</code>
931
932<blockquote>
933<b>Effects:</b> Erases all elements of the index which compare equal to
934<code>value</code>.<br>
935<b>Complexity:</b> <code>O(n + m*D(n))</code>, where <code>m</code>
936is the number of elements erased.<br>
937<b>Exception safety:</b> Basic.
938</blockquote>
939
940<code>template&lt;typename Predicate> void remove_if(Predicate pred);</code>
941
942<blockquote>
943<b>Effects:</b> Erases all elements <code>x</code> of the index for which
944<code>pred(x)</code> holds.<br>
945<b>Complexity:</b> <code>O(n + m*D(n))</code>, where <code>m</code>
946is the number of elements erased.<br>
947<b>Exception safety:</b> Basic.
948</blockquote>
949
950<code>void unique();</code>
951
952<blockquote>
953<b>Effects:</b> Eliminates all but the first element from every consecutive
954group of equal elements referred to by the iterator <code>i</code> in the range
955[<code>first+1</code>,<code>last</code>) for which <code>*i==*(i-1)</code>.<br>
956<b>Complexity:</b> <code>O(n + m*D(n))</code>, where <code>m</code>
957is the number of elements erased.<br>
958<b>Exception safety:</b> Basic.
959</blockquote>
960
961<code>template &lt;class BinaryPredicate> void unique(BinaryPredicate binary_pred);</code>
962
963<blockquote>
964<b>Effects:</b> Eliminates all but the first element from every consecutive
965group of elements referred to by the iterator <code>i</code> in the range
966[<code>first+1</code>,<code>last</code>) for which
967<code>binary_pred(*i,*(i-1))</code> holds.<br>
968<b>Complexity:</b> <code>O(n + m*D(n))</code>, where <code>m</code>
969is the number of elements erased.<br>
970<b>Exception safety:</b> Basic.
971</blockquote>
972
973<code>void merge(index class name&amp; x);</code>
974
975<blockquote>
976<b>Requires:</b> <code>std::less&lt;value_type&gt;</code> induces a
977strict weak ordering over <code>value_type</code>.
978Both the index and <code>x</code> are sorted according to
979<code>std::less&lt;value_type&gt;</code>.<br>
980<b>Effects:</b> Attempts to insert every element of <code>x</code> into the
981corresponding position of the index (according to the order). Elements
982successfully inserted are erased from <code>x</code>. The resulting sequence
983is stable, i.e. equivalent elements of either container preserve their
984relative position. In the special case <code>&amp;x==this</code>, no operation
985is performed.<br>
986<b>Postconditions:</b> Elements in the index and remaining elements in
987<code>x</code> are sorted.
988Validity of iterators to the index and of non-erased elements of <code>x</code>
989references is preserved.<br>
990<b>Complexity:</b> If <code>&amp;x==this</code>, constant; otherwise
991<code>O(n + x.size()*I(n+x.size()) + x.size()*D(x.size()))</code>.<br>
992<b>Exception safety:</b> If <code>&amp;x==this</code>, <code>nothrow</code>;
993otherwise, basic.<br>
994</blockquote>
995
996<code>template &lt;typename Compare> void merge(index class name&amp; x,Compare comp);</code>
997
998<blockquote>
999<b>Requires:</b> <code>Compare</code> induces a
1000strict weak ordering over <code>value_type</code>.
1001Both the index and <code>x</code> are sorted according to <code>comp</code>.<br>
1002<b>Effects:</b> Attempts to insert every element of <code>x</code> into the
1003corresponding position of the index (according to <code>comp</code>).
1004Elements successfully inserted are erased from <code>x</code>. The resulting
1005sequence is stable, i.e. equivalent elements of either container preserve
1006their relative position. In the special case <code>&amp;x==this</code>, no
1007operation is performed.<br>
1008<b>Postconditions:</b> Elements in the index and remaining elements in
1009<code>x</code> are sorted according to <code>comp</code>.
1010Validity of iterators to the index and of non-erased elements of <code>x</code>
1011references is preserved.<br>
1012<b>Complexity:</b> If <code>&amp;x==this</code>, constant; otherwise
1013<code>O(n + x.size()*I(n+x.size()) + x.size()*D(x.size()))</code>.<br>
1014<b>Exception safety:</b> If <code>&amp;x==this</code>, <code>nothrow</code>;
1015otherwise, basic.<br>
1016</blockquote>
1017
1018<code>void sort();</code>
1019
1020<blockquote>
1021<b>Requires:</b> <code>std::less&lt;value_type&gt;</code> induces a
1022strict weark ordering over <code>value_type</code>.<br>
1023<b>Effects:</b> Sorts the index according to
1024<code>std::less&lt;value_type></code>. The sorting is stable, i.e.
1025equivalent elements preserve their relative position.<br>
1026<b>Postconditions:</b> Validity of iterators and references is preserved.<br>
1027<b>Complexity:</b> <code>O(n*log(n))</code>.<br>
1028<b>Exception safety:</b> Basic.
1029</blockquote>
1030
1031<code>template &lt;typename Compare> void sort(Compare comp);</code>
1032
1033<blockquote>
1034<b>Requires:</b> <code>Compare</code> induces a
1035strict weak ordering over <code>value_type</code>.<br>
1036<b>Effects:</b> Sorts the index according to <code>comp</code>. The sorting
1037is stable, i.e. equivalent elements preserve their relative position.<br>
1038<b>Postconditions:</b> Validity of iterators and references is preserved.<br>
1039<b>Complexity:</b> <code>O(n*log(n))</code>.<br>
1040<b>Exception safety:</b> Basic.
1041</blockquote>
1042
1043<code>void reverse()noexcept;</code>
1044
1045<blockquote>
1046<b>Effects:</b> Reverses the order of the elements in the index.<br>
1047<b>Postconditions:</b> Validity of iterators and references is preserved.<br>
1048<b>Complexity:</b> <code>O(n)</code>.<br>
1049</blockquote>
1050
1051<h4><a name="rearrange_operations">Rearrange operations</a></h4>
1052
1053<p>
1054These operations, without counterpart in STL sequence containers
1055(although <code>std::list::splice</code> provides partially overlapping
1056functionality), perform individual and global repositioning of elements
1057inside the index.
1058</p>
1059
1060<code>void relocate(iterator position,iterator i);</code>
1061
1062<blockquote>
1063<b>Requires:</b> <code>position</code> is a valid iterator of the index.
1064<code>i</code> is a valid dereferenceable iterator of the index.<br>
1065<b>Effects:</b> Inserts the element pointed to by <code>i</code> before
1066<code>position</code>. If <code>position==i</code>, no operation is
1067performed.<br>
1068<b>Postconditions:</b> No iterator or reference is invalidated.<br>
1069<b>Complexity:</b> <code>O(rel(position,i,i+1))</code>.<br>
1070<b>Exception safety:</b> <code>nothrow</code>.<br>
1071</blockquote>
1072
1073<code>void relocate(iterator position,iterator first,iterator last);</code>
1074
1075<blockquote>
1076<b>Requires:</b> <code>position</code> is a valid iterator of the index.
1077<code>first</code> and <code>last</code> are valid iterators of the index.
1078<code>last</code> is reachable from <code>first</code>. <code>position</code>
1079is not in the range [<code>first</code>,<code>last</code>).<br>
1080<b>Effects:</b> The range of elements [<code>first</code>,<code>last</code>)
1081is repositioned just before <code>position</code>.<br>
1082<b>Postconditions:</b> No iterator or reference is invalidated.<br>
1083<b>Complexity:</b> <code>O(rel(position,first,last))</code>.<br>
1084<b>Exception safety:</b> <code>nothrow</code>.<br>
1085</blockquote>
1086
1087<a name="rearrange"><code>template&lt;typename InputIterator> void rearrange(InputIterator first);</code></a>
1088
1089<blockquote>
1090<b>Requires:</b> The range [<code>first</code>,
1091<code>std::advance(first,n)</code>),
1092where <code>n</code> is the size of the index, is a
1093<a href="indices.html#views">free view</a> of the index.<br>
1094<b>Effects:</b> The elements are rearranged so as to match the
1095order of the previously described view.<br>
1096<b>Postconditions:</b> No iterator or reference is invalidated.<br>
1097<b>Complexity:</b> <code>O(n)</code>.<br>
1098<b>Exception safety:</b> Basic.<br>
1099</blockquote>
1100
1101<h4><a name="serialization">Serialization</a></h4>
1102
1103<p>
1104Indices cannot be serialized on their own, but only as part of the
1105<code>multi_index_container</code> into which they are embedded. In describing
1106the additional preconditions and guarantees associated to random access indices
1107with respect to serialization of their embedding containers, we
1108use the concepts defined in the <code>multi_index_container</code>
1109<a href="multi_index_container.html#serialization">serialization section</a>.
1110</p>
1111
1112Operation: saving of a <code>multi_index_container</code> <code>m</code> to an
1113output archive (XML archive) <code>ar</code>.
1114
1115<blockquote>
1116<b>Requires:</b> No additional requirements to those imposed by the container.
1117</blockquote>
1118
1119Operation: loading of a <code>multi_index_container</code> <code>m'</code> from an
1120input archive (XML archive) <code>ar</code>.
1121
1122<blockquote>
1123<b>Requires:</b> No additional requirements to those imposed by the container.<br>
1124<b>Postconditions:</b> On successful loading, each of the elements of
1125[<code>begin()</code>, <code>end()</code>) is a restored copy of the corresponding
1126element in [<code>m.get&lt;i&gt;().begin()</code>, <code>m.get&lt;i&gt;().end()</code>),
1127where <code>i</code> is the position of the random access index in the container.
1128</blockquote>
1129
1130Operation: saving of an <code>iterator</code> or <code>const_iterator</code>
1131<code>it</code> to an output archive (XML archive) <code>ar</code>.
1132
1133<blockquote>
1134<b>Requires:</b> <code>it</code> is a valid iterator of the index. The associated
1135<code>multi_index_container</code> has been previously saved.
1136</blockquote>
1137
1138Operation: loading of an <code>iterator</code> or <code>const_iterator</code>
1139<code>it'</code> from an input archive (XML archive) <code>ar</code>.
1140
1141<blockquote>
1142<b>Postconditions:</b> On successful loading, if <code>it</code> was dereferenceable
1143then <code>*it'</code> is the restored copy of <code>*it</code>, otherwise
1144<code>it'==end()</code>.<br>
1145<b>Note:</b> It is allowed that <code>it</code> be a <code>const_iterator</code>
1146and the restored <code>it'</code> an <code>iterator</code>, or viceversa.
1147</blockquote>
1148
1149<hr>
1150
1151<div class="prev_link"><a href="seq_indices.html"><img src="../prev.gif" alt="sequenced indices" border="0"><br>
1152Sequenced indices
1153</a></div>
1154<div class="up_link"><a href="index.html"><img src="../up.gif" alt="Boost.MultiIndex reference" border="0"><br>
1155Boost.MultiIndex reference
1156</a></div>
1157<div class="next_link"><a href="key_extraction.html"><img src="../next.gif" alt="key extraction" border="0"><br>
1158Key extraction
1159</a></div><br clear="all" style="clear: all;">
1160
1161<br>
1162
1163<p>Revised May 9th 2020</p>
1164
1165<p>&copy; Copyright 2003-2020 Joaqu&iacute;n M L&oacute;pez Mu&ntilde;oz.
1166Distributed under the Boost Software
1167License, Version 1.0. (See accompanying file <a href="../../../../LICENSE_1_0.txt">
1168LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
1169http://www.boost.org/LICENSE_1_0.txt</a>)
1170</p>
1171
1172</body>
1173</html>
1174