1 <!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0.1 Transitional//EN">
5 <meta http-equiv=
"Content-Type" content=
"text/html; charset=ISO-8859-1">
6 <title>Boost.MultiIndex Documentation - Tutorial - Container creation
</title>
7 <link rel=
"stylesheet" href=
"../style.css" type=
"text/css">
8 <link rel=
"start" href=
"../index.html">
9 <link rel=
"prev" href=
"key_extraction.html">
10 <link rel=
"up" href=
"index.html">
11 <link rel=
"next" href=
"debug.html">
15 <h1><img src=
"../../../../boost.png" alt=
"boost.png (6897 bytes)" align=
16 "middle" width=
"277" height=
"86">Boost.MultiIndex Tutorial: Container creation
</h1>
18 <div class=
"prev_link"><a href=
"key_extraction.html"><img src=
"../prev.gif" alt=
"key extraction" border=
"0"><br>
21 <div class=
"up_link"><a href=
"index.html"><img src=
"../up.gif" alt=
"Boost.MultiIndex tutorial" border=
"0"><br>
22 Boost.MultiIndex tutorial
24 <div class=
"next_link"><a href=
"debug.html"><img src=
"../next.gif" alt=
"debugging support" border=
"0"><br>
26 </a></div><br clear=
"all" style=
"clear: all;">
33 <li><a href=
"#value_semantics">Value semantics
</a></li>
34 <li><a href=
"#ctor_args_list">Use of
<code>ctor_args_list
</code></a></li>
35 <li><a href=
"#special_allocator">Special allocator support
</a></li>
36 <li><a href=
"#serialization">Serialization
</a></li>
39 <h2><a name=
"value_semantics">Value semantics
</a></h2>
42 <code>multi_index_container
</code>s have the usual value semantics associated
43 to copy construction and assignment, i.e. copies of the elements from the source
44 container are created and inserted into the destination container.
45 More interestingly, copying also recreates the original order in which
46 elements are arranged for
<i>every index
</i> of the container.
47 This implies that equality of all indices is preserved under copying
48 or assignment, for those index types where equality is defined. This behavior
49 can be regarded as a natural extension to the general rule on copy semantics
50 stating that if
<code>y
</code> is a copy of
<code>x
</code>, then
54 <h2><a name=
"ctor_args_list">Use of
<code>ctor_args_list
</code></a></h2>
57 Although in most cases
<code>multi_index_container
</code>s will be default constructed
58 (or copied from a preexisting
<code>multi_index_container
</code>), sometimes it is
59 necessary to specify particular values for the internal objects used (key extractors,
60 comparison predicates, allocator), for instance if some of these objects do not have
61 a default constructor. The same situation can arise with standard STL containers,
62 which allow for the optional specification of such objects:
66 <span class=comment
>// example of non-default constructed std::set
</span>
67 <span class=keyword
>template
</span><span class=special
><</span><span class=keyword
>typename
</span> <span class=identifier
>IntegralType
</span><span class=special
>></span>
68 <span class=keyword
>struct
</span> <span class=identifier
>modulo_less
</span>
69 <span class=special
>{
</span>
70 <span class=identifier
>modulo_less
</span><span class=special
>(
</span><span class=identifier
>IntegralType
</span> <span class=identifier
>m
</span><span class=special
>):
</span><span class=identifier
>modulo
</span><span class=special
>(
</span><span class=identifier
>m
</span><span class=special
>){}
</span>
72 <span class=keyword
>bool
</span> <span class=keyword
>operator
</span><span class=special
>()(
</span><span class=identifier
>IntegralType
</span> <span class=identifier
>x
</span><span class=special
>,
</span><span class=identifier
>IntegralType
</span> <span class=identifier
>y
</span><span class=special
>)
</span><span class=keyword
>const
</span>
73 <span class=special
>{
</span>
74 <span class=keyword
>return
</span> <span class=special
>(
</span><span class=identifier
>x
</span><span class=special
>%
</span><span class=identifier
>modulo
</span><span class=special
>)
<(
</span><span class=identifier
>y
</span><span class=special
>%
</span><span class=identifier
>modulo
</span><span class=special
>);
</span>
75 <span class=special
>}
</span>
77 <span class=keyword
>private
</span><span class=special
>:
</span>
78 <span class=identifier
>IntegralType
</span> <span class=identifier
>modulo
</span><span class=special
>;
</span>
79 <span class=special
>};
</span>
81 <span class=keyword
>typedef
</span> <span class=identifier
>std
</span><span class=special
>::
</span><span class=identifier
>set
</span><span class=special
><</span><span class=keyword
>unsigned
</span> <span class=keyword
>int
</span><span class=special
>,
</span><span class=identifier
>modulo_less
</span><span class=special
><</span><span class=keyword
>unsigned
</span> <span class=keyword
>int
</span><span class=special
>></span> <span class=special
>></span> <span class=identifier
>modulo_set
</span><span class=special
>;
</span>
83 <span class=identifier
>modulo_set
</span> <span class=identifier
>m
</span><span class=special
>(
</span><span class=identifier
>modulo_less
</span><span class=special
><</span><span class=keyword
>unsigned
</span> <span class=keyword
>int
</span><span class=special
>>(
</span><span class=number
>10</span><span class=special
>));
</span>
87 <code>multi_index_container
</code> does also provide this functionality, though in a
88 considerably more complex fashion, due to the fact that the constructor
89 of a
<code>multi_index_container
</code> has to accept values for all the internal
90 objects of its indices. The full form of
<code>multi_index_container
</code> constructor
95 <span class=keyword
>explicit
</span> <span class=identifier
>multi_index_container
</span><span class=special
>(
</span>
96 <span class=keyword
>const
</span> <span class=identifier
>ctor_args_list
</span><span class=special
>&</span> <span class=identifier
>args_list
</span><span class=special
>=
</span><span class=identifier
>ctor_args_list
</span><span class=special
>(),
</span>
97 <span class=keyword
>const
</span> <span class=identifier
>allocator_type
</span><span class=special
>&</span> <span class=identifier
>al
</span><span class=special
>=
</span><span class=identifier
>allocator_type
</span><span class=special
>());
</span>
101 The specification of the allocator object poses no particular problems;
102 as for the
<code>ctor_args_list
</code>, this object is designed so as to hold
103 the necessary construction values for every index in the
<code>multi_index_container
</code>.
104 From the point of view of the user,
<code>ctor_args_list
</code> is equivalent
109 <span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>tuple
</span><span class=special
><</span><span class=identifier
>C
<sub>0</sub></span><span class=special
>,...,
</span><span class=identifier
>C
<sub>I-
1</sub></span><span class=special
>></span>
113 where
<code>I
</code> is the number of indices, and
<code>C
<sub>i
</sub></code> is
117 <span class=identifier
>nth_index
</span><span class=special
><</span><span class=identifier
>i
</span><span class=special
>>::
</span><span class=identifier
>type
</span><span class=special
>::
</span><span class=identifier
>ctor_args
</span>
121 that is, the nested type
<code>ctor_args
</code> of the
<code>i
</code>-th index. Each
122 <code>ctor_args
</code> type is in turn a tuple holding values for constructor
123 arguments of the associated index: so, ordered indices demand a key extractor object
124 and a comparison predicate, hashed indices take an initial number of buckets,
125 a key extractor, a hash function and an equality predicate; while sequenced
126 and random access indices do not need any construction argument. For instance,
131 <span class=keyword
>typedef
</span> <span class=identifier
>multi_index_container
</span><span class=special
><</span>
132 <span class=keyword
>unsigned
</span> <span class=keyword
>int
</span><span class=special
>,
</span>
133 <span class=identifier
>indexed_by
</span><span class=special
><</span>
134 <span class=identifier
>hashed_unique
</span><span class=special
><</span><span class=identifier
>identity
</span><span class=special
><</span><span class=keyword
>unsigned
</span> <span class=keyword
>int
</span><span class=special
>></span> <span class=special
>>,
</span>
135 <span class=identifier
>ordered_non_unique
</span><span class=special
><</span><span class=identifier
>identity
</span><span class=special
><</span><span class=keyword
>unsigned
</span> <span class=keyword
>int
</span><span class=special
>>,
</span> <span class=identifier
>modulo_less
</span><span class=special
><</span><span class=keyword
>unsigned
</span> <span class=keyword
>int
</span><span class=special
>></span> <span class=special
>>,
</span>
136 <span class=identifier
>sequenced
</span><span class=special
><>,
</span>
137 <span class=identifier
>random_access
</span><span class=special
><></span>
138 <span class=special
>></span>
139 <span class=special
>></span> <span class=identifier
>modulo_indexed_set
</span><span class=special
>;
</span>
143 the corresponding
<code>ctor_args_list
</code> type is equivalent to
147 <span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>tuple
</span><span class=special
><</span>
148 <span class=comment
>// ctr_args of index #
0</span>
149 <span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>tuple
</span><span class=special
><</span>
150 <span class=identifier
>std
</span><span class=special
>::
</span><span class=identifier
>size_t
</span><span class=special
>,
</span> <span class=comment
>// initial number of buckets;
0 if unspecified
</span>
151 <span class=identifier
>identity
</span><span class=special
><</span><span class=keyword
>unsigned
</span> <span class=keyword
>int
</span><span class=special
>>,
</span>
152 <span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>hash
</span><span class=special
><</span><span class=keyword
>unsigned
</span> <span class=keyword
>int
</span><span class=special
>>,
</span>
153 <span class=identifier
>std
</span><span class=special
>::
</span><span class=identifier
>equal_to
</span><span class=special
><</span><span class=keyword
>unsigned
</span> <span class=keyword
>int
</span><span class=special
>></span> <span class=special
>>,
</span>
155 <span class=comment
>// ctr_args of index #
1</span>
156 <span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>tuple
</span><span class=special
><</span>
157 <span class=identifier
>identity
</span><span class=special
><</span><span class=keyword
>unsigned
</span> <span class=keyword
>int
</span><span class=special
>>,
</span>
158 <span class=identifier
>modulo_less
</span><span class=special
><</span><span class=keyword
>unsigned
</span> <span class=keyword
>int
</span><span class=special
>></span> <span class=special
>>,
</span>
160 <span class=comment
>// sequenced indices do not have any construction argument
</span>
161 <span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>tuple
</span><span class=special
><>,
</span>
163 <span class=comment
>// neither do random access indices
</span>
164 <span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>tuple
</span><span class=special
><></span>
165 <span class=special
>></span>
169 Such a
<code>modulo_indexed_set
</code> cannot be default constructed, because
170 <code>modulo_less
</code> does not provide a default constructor. The following shows
171 how the construction can be done:
175 <span class=identifier
>modulo_indexed_set
</span><span class=special
>::
</span><span class=identifier
>ctor_args_list
</span> <span class=identifier
>args_list
</span><span class=special
>=
</span>
176 <span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>make_tuple
</span><span class=special
>(
</span>
177 <span class=comment
>// ctor_args for index #
0 is default constructible
</span>
178 <span class=identifier
>modulo_indexed_set
</span><span class=special
>::
</span><span class=identifier
>nth_index
</span><span class=special
><</span><span class=number
>0</span><span class=special
>>::
</span><span class=identifier
>type
</span><span class=special
>::
</span><span class=identifier
>ctor_args
</span><span class=special
>(),
</span>
180 <span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>make_tuple
</span><span class=special
>(
</span><span class=identifier
>identity
</span><span class=special
><</span><span class=keyword
>unsigned
</span> <span class=keyword
>int
</span><span class=special
>>(),
</span><span class=identifier
>modulo_less
</span><span class=special
><</span><span class=keyword
>unsigned
</span> <span class=keyword
>int
</span><span class=special
>>(
</span><span class=number
>10</span><span class=special
>)),
</span>
182 <span class=comment
>// these are also default constructible (actually, empty tuples)
</span>
183 <span class=identifier
>modulo_indexed_set
</span><span class=special
>::
</span><span class=identifier
>nth_index
</span><span class=special
><</span><span class=number
>2</span><span class=special
>>::
</span><span class=identifier
>type
</span><span class=special
>::
</span><span class=identifier
>ctor_args
</span><span class=special
>(),
</span>
184 <span class=identifier
>modulo_indexed_set
</span><span class=special
>::
</span><span class=identifier
>nth_index
</span><span class=special
><</span><span class=number
>3</span><span class=special
>>::
</span><span class=identifier
>type
</span><span class=special
>::
</span><span class=identifier
>ctor_args
</span><span class=special
>()
</span>
185 <span class=special
>);
</span>
187 <span class=identifier
>modulo_indexed_set
</span> <span class=identifier
>m
</span><span class=special
>(
</span><span class=identifier
>args_list
</span><span class=special
>);
</span>
191 A program is provided in the
<a href=
"../examples.html#example3">examples section
</a> that
192 puts in practise these concepts.
195 <h2><a name=
"special_allocator">Special allocator support
</a></h2>
198 Boost.MultiIndex allows for a slightly more general class of allocators
199 than strictly required by the C++ standard, as explained in detail in the
200 <a href=
"../reference/multi_index_container.html#instantiation_types">reference
</a>.
201 An important type of non-standard allocators supported are those provided by the
202 <a href=
"../../../interprocess/index.html">Boost Interprocess Library
</a>;
203 this opens up the possibility of placing
<code>multi_index_container
</code>s
208 <span class=preprocessor
>#include
</span> <span class=special
><</span><span class=identifier
>boost
</span><span class=special
>/
</span><span class=identifier
>interprocess
</span><span class=special
>/
</span><span class=identifier
>allocators
</span><span class=special
>/
</span><span class=identifier
>allocator
</span><span class=special
>.
</span><span class=identifier
>hpp
</span><span class=special
>></span>
209 <span class=preprocessor
>#include
</span> <span class=special
><</span><span class=identifier
>boost
</span><span class=special
>/
</span><span class=identifier
>interprocess
</span><span class=special
>/
</span><span class=identifier
>managed_shared_memory
</span><span class=special
>.
</span><span class=identifier
>hpp
</span><span class=special
>></span>
211 <span class=keyword
>namespace
</span> <span class=identifier
>bip
</span><span class=special
>=
</span><span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>interprocess
</span><span class=special
>;
</span>
213 <span class=comment
>// a shared memory compatible allocator of ints
</span>
214 <span class=keyword
>typedef
</span> <span class=identifier
>bip
</span><span class=special
>::
</span><span class=identifier
>allocator
</span><span class=special
><</span>
215 <span class=keyword
>int
</span><span class=special
>,
</span><span class=identifier
>bip
</span><span class=special
>::
</span><span class=identifier
>managed_shared_memory
</span><span class=special
>::
</span><span class=identifier
>segment_manager
</span>
216 <span class=special
>></span> <span class=identifier
>shared_int_allocator
</span><span class=special
>;
</span>
218 <span class=comment
>// define a shared memory compatible multi_index_container
219 // using shared_int_allocator
</span>
220 <span class=keyword
>typedef
</span> <span class=identifier
>multi_index_container
</span><span class=special
><</span>
221 <span class=keyword
>int
</span><span class=special
>,
</span>
222 <span class=identifier
>indexed_by
</span><span class=special
><</span>
223 <span class=identifier
>sequenced
</span><span class=special
><>,
</span>
224 <span class=identifier
>ordered_unique
</span><span class=special
><</span><span class=identifier
>identity
</span><span class=special
><</span><span class=keyword
>int
</span><span class=special
>></span> <span class=special
>></span>
225 <span class=special
>>,
</span>
226 <span class=identifier
>shared_int_allocator
</span>
227 <span class=special
>></span> <span class=identifier
>unique_int_list
</span><span class=special
>;
</span>
229 <span class=special
>...
</span>
231 <span class=comment
>// create a managed memory segment
</span>
232 <span class=identifier
>bip
</span><span class=special
>::
</span><span class=identifier
>managed_shared_memory
</span> <span class=identifier
>seg
</span><span class=special
>(
</span>
233 <span class=identifier
>bip
</span><span class=special
>::
</span><span class=identifier
>create_only
</span><span class=special
>,
</span><span class=string
>"SharedMemoryID
"</span><span class=special
>,
</span><span class=number
>65536</span><span class=special
>);
</span>
235 <span class=comment
>// construct a unique_int_list into the segment
</span>
236 <span class=identifier
>unique_int_list
</span><span class=special
>*
</span> <span class=identifier
>puil
</span><span class=special
>=
</span><span class=identifier
>seg
</span><span class=special
>.
</span><span class=identifier
>construct
</span><span class=special
><</span><span class=identifier
>unique_int_list
</span><span class=special
>></span>
237 <span class=special
>(
</span><span class=string
>"UniqueIntListID
"</span><span class=special
>)
</span> <span class=comment
>// object identifier within the segment
238 // Construction args: first a ctor arg list, then a
239 // shared memory allocator obtained from the segment object.
</span>
240 <span class=special
>(
</span><span class=identifier
>unique_int_list
</span><span class=special
>::
</span><span class=identifier
>ctor_args_list
</span><span class=special
>(),
</span>
241 <span class=identifier
>unique_int_list
</span><span class=special
>::
</span><span class=identifier
>allocator_type
</span><span class=special
>(
</span><span class=identifier
>seg
</span><span class=special
>.
</span><span class=identifier
>get_segment_manager
</span><span class=special
>()));
</span>
245 The examples section includes a
<a href=
"../examples.html#example12">program
</a>
246 that further explores this capability.
249 <h2><a name=
"serialization">Serialization
</a></h2>
252 <code>multi_index_container
</code>s can be archived and retrieved by means of the
253 <a href=
"../../../serialization/index.html">Boost Serialization Library
</a>. Both regular
254 and XML archives are supported. The usage is straightforward and does not
255 differ from that of any other serializable type. For instance:
259 <span class=preprocessor
>#include
</span> <span class=special
><</span><span class=identifier
>boost
</span><span class=special
>/
</span><span class=identifier
>archive
</span><span class=special
>/
</span><span class=identifier
>text_oarchive
</span><span class=special
>.
</span><span class=identifier
>hpp
</span><span class=special
>></span>
260 <span class=preprocessor
>#include
</span> <span class=special
><</span><span class=identifier
>boost
</span><span class=special
>/
</span><span class=identifier
>archive
</span><span class=special
>/
</span><span class=identifier
>text_iarchive
</span><span class=special
>.
</span><span class=identifier
>hpp
</span><span class=special
>></span>
261 <span class=preprocessor
>#include
</span> <span class=special
><</span><span class=identifier
>fstream
</span><span class=special
>></span>
263 <span class=special
>...
</span>
265 <span class=keyword
>void
</span> <span class=identifier
>save
</span><span class=special
>(
</span><span class=keyword
>const
</span> <span class=identifier
>employee_set
</span><span class=special
>&</span> <span class=identifier
>es
</span><span class=special
>)
</span>
266 <span class=special
>{
</span>
267 <span class=identifier
>std
</span><span class=special
>::
</span><span class=identifier
>ofstream
</span> <span class=identifier
>ofs
</span><span class=special
>(
</span><span class=string
>"data
"</span><span class=special
>);
</span>
268 <span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>archive
</span><span class=special
>::
</span><span class=identifier
>text_oarchive
</span> <span class=identifier
>oa
</span><span class=special
>(
</span><span class=identifier
>ofs
</span><span class=special
>);
</span>
269 <span class=identifier
>oa
</span><span class=special
><<</span><span class=identifier
>es
</span><span class=special
>;
</span>
270 <span class=special
>}
</span>
272 <span class=keyword
>void
</span> <span class=identifier
>load
</span><span class=special
>(
</span><span class=identifier
>employee_set
</span><span class=special
>&</span> <span class=identifier
>es
</span><span class=special
>)
</span>
273 <span class=special
>{
</span>
274 <span class=identifier
>std
</span><span class=special
>::
</span><span class=identifier
>ifstream
</span> <span class=identifier
>ifs
</span><span class=special
>(
</span><span class=string
>"data
"</span><span class=special
>);
</span>
275 <span class=identifier
>boost
</span><span class=special
>::
</span><span class=identifier
>archive
</span><span class=special
>::
</span><span class=identifier
>text_iarchive
</span> <span class=identifier
>ia
</span><span class=special
>(
</span><span class=identifier
>ifs
</span><span class=special
>);
</span>
276 <span class=identifier
>ia
</span><span class=special
>>></span><span class=identifier
>es
</span><span class=special
>;
</span>
277 <span class=special
>}
</span>
279 <span class=special
>...
</span>
281 <span class=identifier
>employee_set
</span> <span class=identifier
>es
</span><span class=special
>;
</span>
282 <span class=special
>...
</span> <span class=comment
>// fill it with data
</span>
283 <span class=identifier
>save
</span><span class=special
>(
</span><span class=identifier
>es
</span><span class=special
>);
</span>
285 <span class=special
>...
</span>
287 <span class=identifier
>employee_set
</span> <span class=identifier
>restored_es
</span><span class=special
>;
</span>
288 <span class=identifier
>load
</span><span class=special
>(
</span><span class=identifier
>restored_es
</span><span class=special
>);
</span>
292 Serialization capabilities are automatically provided by just linking with
293 the appropriate Boost.Serialization library module: it is not necessary
294 to explicitly include any header from Boost.Serialization,
295 apart from those declaring the type of archive used in the process. If not used,
296 however, serialization support can be disabled by globally defining the macro
297 <code>BOOST_MULTI_INDEX_DISABLE_SERIALIZATION
</code>. Disabling serialization
298 for Boost.MultiIndex can yield a small improvement in build times, and may
299 be necessary in those defective compilers that fail to correctly process
300 Boost.Serialization headers.
304 In accordance with Boost.MultiIndex
305 <a href=
"#value_semantics">value semantics
</a>, retrieving an
306 archived
<code>multi_index_container
</code> restores not only
307 the elements, but also the order they were arranged into for
308 every index of the container. There is an exception to this rule,
309 though: for
<a href=
"indices.html#hashed_indices">hashed
310 indices
</a>, no guarantee is made about the order in which elements will
311 be iterated in the restored container; in general, it is unwise to rely on
312 the ordering of elements of a hashed index, since it can change in arbitrary
313 ways during insertion or rehashing --this is precisely the reason why
314 hashed indices and TR1 unordered associative containers do not define
315 an equality operator.
319 Iterators to indices of a
<code>multi_index_container
</code> can also be
320 serialized. Serialization of iterators must be done only after serializing
321 their corresponding container.
325 <a href=
"../examples.html#example9">Example
9</a> in the examples section shows
326 the serialization capabilities of Boost.MultiIndex.
331 <div class=
"prev_link"><a href=
"key_extraction.html"><img src=
"../prev.gif" alt=
"key extraction" border=
"0"><br>
334 <div class=
"up_link"><a href=
"index.html"><img src=
"../up.gif" alt=
"Boost.MultiIndex tutorial" border=
"0"><br>
335 Boost.MultiIndex tutorial
337 <div class=
"next_link"><a href=
"debug.html"><img src=
"../next.gif" alt=
"debugging support" border=
"0"><br>
339 </a></div><br clear=
"all" style=
"clear: all;">
343 <p>Revised July
17th
2007</p>
345 <p>© Copyright
2003-
2007 Joaqu
ín M L
ópez Mu
ñoz.
346 Distributed under the Boost Software
347 License, Version
1.0. (See accompanying file
<a href=
"../../../../LICENSE_1_0.txt">
348 LICENSE_1_0.txt
</a> or copy at
<a href=
"http://www.boost.org/LICENSE_1_0.txt">
349 http://www.boost.org/LICENSE_1_0.txt
</a>)