]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | <html> |
2 | <head> | |
3 | <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> | |
4 | <title>Boost Libraries that work well with Boost.Bimap</title> | |
5 | <link rel="stylesheet" href="../../boostbook.css" type="text/css"> | |
6 | <meta name="generator" content="DocBook XSL Stylesheets V1.77.1"> | |
7 | <link rel="home" href="../../index.html" title="Chapter 1. Boost.Bimap"> | |
8 | <link rel="up" href="../bimap_and_boost.html" title="Bimap and Boost"> | |
9 | <link rel="prev" href="../bimap_and_boost.html" title="Bimap and Boost"> | |
10 | <link rel="next" href="dependencies.html" title="Dependencies"> | |
11 | </head> | |
12 | <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> | |
13 | <table cellpadding="2" width="100%"><tr> | |
14 | <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> | |
15 | <td align="center"><a href="../../../../../../index.html">Home</a></td> | |
16 | <td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> | |
17 | <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> | |
18 | <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> | |
19 | <td align="center"><a href="../../../../../../more/index.htm">More</a></td> | |
20 | </tr></table> | |
21 | <hr> | |
22 | <div class="spirit-nav"> | |
23 | <a accesskey="p" href="../bimap_and_boost.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../bimap_and_boost.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="dependencies.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> | |
24 | </div> | |
25 | <div class="section boost_bimap_bimap_and_boost_boost_libraries_that_work_well_with_boost_bimap"> | |
26 | <div class="titlepage"><div><div><h3 class="title"> | |
27 | <a name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap"></a><a class="link" href="boost_libraries_that_work_well_with_boost_bimap.html" title="Boost Libraries that work well with Boost.Bimap">Boost | |
28 | Libraries that work well with Boost.Bimap</a> | |
29 | </h3></div></div></div> | |
30 | <div class="toc"><dl> | |
31 | <dt><span class="section"><a href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.introduction">Introduction</a></span></dt> | |
32 | <dt><span class="section"><a href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_serialization">Boost.Serialization</a></span></dt> | |
33 | <dt><span class="section"><a href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_assign">Boost.Assign</a></span></dt> | |
34 | <dt><span class="section"><a href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_hash">Boost.Hash</a></span></dt> | |
35 | <dt><span class="section"><a href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_lambda">Boost.Lambda</a></span></dt> | |
36 | <dt><span class="section"><a href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_range">Boost.Range</a></span></dt> | |
37 | <dt><span class="section"><a href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_foreach">Boost.Foreach</a></span></dt> | |
38 | <dt><span class="section"><a href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_typeof">Boost.Typeof</a></span></dt> | |
39 | <dt><span class="section"><a href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_xpressive">Boost.Xpressive</a></span></dt> | |
40 | <dt><span class="section"><a href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_property_map">Boost.Property_map</a></span></dt> | |
41 | </dl></div> | |
42 | <div class="section boost_bimap_bimap_and_boost_boost_libraries_that_work_well_with_boost_bimap_introduction"> | |
43 | <div class="titlepage"><div><div><h4 class="title"> | |
44 | <a name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.introduction"></a><a class="link" href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.introduction" title="Introduction">Introduction</a> | |
45 | </h4></div></div></div> | |
46 | <div class="informaltable"><table class="table"> | |
47 | <colgroup> | |
48 | <col> | |
49 | <col> | |
50 | <col> | |
51 | <col> | |
52 | </colgroup> | |
53 | <thead><tr> | |
54 | <th> | |
55 | <p> | |
56 | Name | |
57 | </p> | |
58 | </th> | |
59 | <th> | |
60 | <p> | |
61 | Description | |
62 | </p> | |
63 | </th> | |
64 | <th> | |
65 | <p> | |
66 | author | |
67 | </p> | |
68 | </th> | |
69 | <th> | |
70 | <p> | |
71 | Purpose | |
72 | </p> | |
73 | </th> | |
74 | </tr></thead> | |
75 | <tbody> | |
76 | <tr> | |
77 | <td> | |
78 | <p> | |
79 | <a href="http://www.boost.org/libs/serialization/doc/index.html" target="_top"><span class="bold"><strong>Boost.Serialization</strong></span></a> | |
80 | </p> | |
81 | </td> | |
82 | <td> | |
83 | <p> | |
84 | Serialization for persistence and marshalling | |
85 | </p> | |
86 | </td> | |
87 | <td> | |
88 | <p> | |
89 | Robert Ramey | |
90 | </p> | |
91 | </td> | |
92 | <td> | |
93 | <p> | |
94 | Serialization support for bimap containers and iterators | |
95 | </p> | |
96 | </td> | |
97 | </tr> | |
98 | <tr> | |
99 | <td> | |
100 | <p> | |
101 | <a href="http://www.boost.org/libs/assign/doc/index.html" target="_top"><span class="bold"><strong>Boost.Assign</strong></span></a> | |
102 | </p> | |
103 | </td> | |
104 | <td> | |
105 | <p> | |
106 | Filling containers with constant or generated data has never | |
107 | been easier | |
108 | </p> | |
109 | </td> | |
110 | <td> | |
111 | <p> | |
112 | Thorsten Ottosen | |
113 | </p> | |
114 | </td> | |
115 | <td> | |
116 | <p> | |
117 | Help to fill a bimap or views of it | |
118 | </p> | |
119 | </td> | |
120 | </tr> | |
121 | <tr> | |
122 | <td> | |
123 | <p> | |
124 | <a href="http://www.boost.org/doc/html/hash.html" target="_top"><span class="bold"><strong>Boost.Hash</strong></span></a> | |
125 | </p> | |
126 | </td> | |
127 | <td> | |
128 | <p> | |
129 | A TR1 hash function object that can be extended to hash user | |
130 | defined types | |
131 | </p> | |
132 | </td> | |
133 | <td> | |
134 | <p> | |
135 | Daniel James | |
136 | </p> | |
137 | </td> | |
138 | <td> | |
139 | <p> | |
140 | Default hashing function | |
141 | </p> | |
142 | </td> | |
143 | </tr> | |
144 | <tr> | |
145 | <td> | |
146 | <p> | |
147 | <a href="http://www.boost.org/doc/html/lambda.html" target="_top"><span class="bold"><strong>Boost.Lambda</strong></span></a> | |
148 | </p> | |
149 | </td> | |
150 | <td> | |
151 | <p> | |
152 | Define small unnamed function objects at the actual call site, | |
153 | and more | |
154 | </p> | |
155 | </td> | |
156 | <td> | |
157 | <p> | |
158 | from Jaakko Järvi, Gary Powell | |
159 | </p> | |
160 | </td> | |
161 | <td> | |
162 | <p> | |
163 | Functors for modify, range, lower_bound and upper_bound | |
164 | </p> | |
165 | </td> | |
166 | </tr> | |
167 | <tr> | |
168 | <td> | |
169 | <p> | |
170 | <a href="http://www.boost.org/doc/html/range.html" target="_top"><span class="bold"><strong>Boost.Range</strong></span></a> | |
171 | </p> | |
172 | </td> | |
173 | <td> | |
174 | <p> | |
175 | A new infrastructure for generic algorithms that builds on top | |
176 | of the new iterator concepts | |
177 | </p> | |
178 | </td> | |
179 | <td> | |
180 | <p> | |
181 | Thorsten Ottosen | |
182 | </p> | |
183 | </td> | |
184 | <td> | |
185 | <p> | |
186 | Range based algorithms | |
187 | </p> | |
188 | </td> | |
189 | </tr> | |
190 | <tr> | |
191 | <td> | |
192 | <p> | |
193 | <a href="http://www.boost.org/doc/html/foreach.html" target="_top"><span class="bold"><strong>Boost.Foreach</strong></span></a> | |
194 | </p> | |
195 | </td> | |
196 | <td> | |
197 | <p> | |
198 | BOOST_FOREACH macro for easily iterating over the elements of | |
199 | a sequence | |
200 | </p> | |
201 | </td> | |
202 | <td> | |
203 | <p> | |
204 | Eric Niebler | |
205 | </p> | |
206 | </td> | |
207 | <td> | |
208 | <p> | |
209 | Iteration | |
210 | </p> | |
211 | </td> | |
212 | </tr> | |
213 | <tr> | |
214 | <td> | |
215 | <p> | |
216 | <a href="http://www.boost.org/libs/typeof/doc/index.html" target="_top"><span class="bold"><strong>Boost.Typeof</strong></span></a> | |
217 | </p> | |
218 | </td> | |
219 | <td> | |
220 | <p> | |
221 | Typeof operator emulation | |
222 | </p> | |
223 | </td> | |
224 | <td> | |
225 | <p> | |
226 | Arkadiy Vertleyb, Peder Holt | |
227 | </p> | |
228 | </td> | |
229 | <td> | |
230 | <p> | |
231 | Using BOOST_AUTO while we wait for C++0x | |
232 | </p> | |
233 | </td> | |
234 | </tr> | |
235 | <tr> | |
236 | <td> | |
237 | <p> | |
238 | <a href="http://www.boost.org/libs/xpressive/doc/index.html" target="_top"><span class="bold"><strong>Boost.Xpressive</strong></span></a> | |
239 | </p> | |
240 | </td> | |
241 | <td> | |
242 | <p> | |
243 | Regular expressions that can be written as strings or as expression | |
244 | templates | |
245 | </p> | |
246 | </td> | |
247 | <td> | |
248 | <p> | |
249 | Eric Niebler | |
250 | </p> | |
251 | </td> | |
252 | <td> | |
253 | <p> | |
254 | Help to fill a bimap from a string | |
255 | </p> | |
256 | </td> | |
257 | </tr> | |
258 | <tr> | |
259 | <td> | |
260 | <p> | |
261 | <a href="http://www.boost.org/doc/html/property_map.html" target="_top"><span class="bold"><strong>Boost.PropertyMap</strong></span></a> | |
262 | </p> | |
263 | </td> | |
264 | <td> | |
265 | <p> | |
266 | Concepts defining interfaces which map key objects to value objects | |
267 | </p> | |
268 | </td> | |
269 | <td> | |
270 | <p> | |
271 | Jeremy Siek | |
272 | </p> | |
273 | </td> | |
274 | <td> | |
275 | <p> | |
276 | Integration with BGL | |
277 | </p> | |
278 | </td> | |
279 | </tr> | |
280 | </tbody> | |
281 | </table></div> | |
282 | </div> | |
283 | <div class="section boost_bimap_bimap_and_boost_boost_libraries_that_work_well_with_boost_bimap_boost_serialization"> | |
284 | <div class="titlepage"><div><div><h4 class="title"> | |
285 | <a name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_serialization"></a><a class="link" href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_serialization" title="Boost.Serialization">Boost.Serialization</a> | |
286 | </h4></div></div></div> | |
287 | <p> | |
288 | A bimap can be archived and retrieved by means of the Boost.Serialization | |
289 | Library. Both regular and XML archives are supported. The usage is straightforward | |
290 | and does not differ from that of any other serializable type. For instance: | |
291 | </p> | |
292 | <p> | |
293 | <a href="../../../../example/bimap_and_boost/serialization.cpp" target="_top">Go to source | |
294 | code</a> | |
295 | </p> | |
296 | <p> | |
297 | </p> | |
298 | <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">int</span> <span class="special">></span> <span class="identifier">bm_type</span><span class="special">;</span> | |
299 | ||
300 | <span class="comment">// Create a bimap and serialize it to a file</span> | |
301 | <span class="special">{</span> | |
302 | <span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span> | |
303 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="string">"one"</span><span class="special">,</span><span class="number">1</span><span class="special">)</span> <span class="special">);</span> | |
304 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="string">"two"</span><span class="special">,</span><span class="number">2</span><span class="special">)</span> <span class="special">);</span> | |
305 | ||
306 | <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> | |
307 | <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> | |
308 | ||
309 | <span class="identifier">oa</span> <span class="special"><<</span> <span class="keyword">const_cast</span><span class="special"><</span><span class="keyword">const</span> <span class="identifier">bm_type</span><span class="special">&>(</span><span class="identifier">bm</span><span class="special">);</span> <a class="co" name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_serialization.c0" href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_serialization.c1"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a> | |
310 | ||
311 | <a class="co" name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_serialization.c2" href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_serialization.c3"><img src="../../../../../../doc/src/images/callouts/2.png" alt="2" border="0"></a><span class="keyword">const</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">left_iterator</span> <span class="identifier">left_iter</span> <span class="special">=</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="string">"two"</span><span class="special">);</span> | |
312 | <span class="identifier">oa</span> <span class="special"><<</span> <span class="identifier">left_iter</span><span class="special">;</span> | |
313 | ||
314 | <span class="keyword">const</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">right_iterator</span> <span class="identifier">right_iter</span> <span class="special">=</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="number">1</span><span class="special">);</span> | |
315 | <span class="identifier">oa</span> <span class="special"><<</span> <span class="identifier">right_iter</span><span class="special">;</span> | |
316 | <span class="special">}</span> | |
317 | ||
318 | <span class="comment">// Load the bimap back</span> | |
319 | <span class="special">{</span> | |
320 | <span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span> | |
321 | ||
322 | <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> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ios</span><span class="special">::</span><span class="identifier">binary</span><span class="special">);</span> | |
323 | <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> | |
324 | ||
325 | <span class="identifier">ia</span> <span class="special">>></span> <span class="identifier">bm</span><span class="special">;</span> | |
326 | ||
327 | <span class="identifier">assert</span><span class="special">(</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">2</span> <span class="special">);</span> | |
328 | ||
329 | <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">left_iterator</span> <span class="identifier">left_iter</span><span class="special">;</span> | |
330 | <span class="identifier">ia</span> <span class="special">>></span> <span class="identifier">left_iter</span><span class="special">;</span> | |
331 | ||
332 | <span class="identifier">assert</span><span class="special">(</span> <span class="identifier">left_iter</span><span class="special">-></span><span class="identifier">first</span> <span class="special">==</span> <span class="string">"two"</span> <span class="special">);</span> | |
333 | ||
334 | <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">right_iterator</span> <span class="identifier">right_iter</span><span class="special">;</span> | |
335 | <span class="identifier">ia</span> <span class="special">>></span> <span class="identifier">right_iter</span><span class="special">;</span> | |
336 | ||
337 | <span class="identifier">assert</span><span class="special">(</span> <span class="identifier">right_iter</span><span class="special">-></span><span class="identifier">first</span> <span class="special">==</span> <span class="number">1</span> <span class="special">);</span> | |
338 | <span class="special">}</span> | |
339 | </pre> | |
340 | <p> | |
341 | </p> | |
342 | <div class="calloutlist"><table border="0" summary="Callout list"> | |
343 | <tr> | |
344 | <td width="5%" valign="top" align="left"><p><a name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_serialization.c1"></a><a href="#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_serialization.c0"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a> </p></td> | |
345 | <td valign="top" align="left"><p> | |
346 | We must do a const cast because Boost.Serialization archives only save | |
347 | const objects. Read Boost.Serializartion docs for the rationale behind | |
348 | this decision | |
349 | </p></td> | |
350 | </tr> | |
351 | <tr> | |
352 | <td width="5%" valign="top" align="left"><p><a name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_serialization.c3"></a><a href="#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_serialization.c2"><img src="../../../../../../doc/src/images/callouts/2.png" alt="2" border="0"></a> </p></td> | |
353 | <td valign="top" align="left"><p> | |
354 | We can only serialize iterators if the bimap was serialized first. | |
355 | Note that the const cast is not requiered here because we create our | |
356 | iterators as const. | |
357 | </p></td> | |
358 | </tr> | |
359 | </table></div> | |
360 | <p> | |
361 | Serialization capabilities are automatically provided by just linking with | |
362 | the appropriate Boost.Serialization library module: it is not necessary | |
363 | to explicitly include any header from Boost.Serialization, apart from those | |
364 | declaring the type of archive used in the process. If not used, however, | |
365 | serialization support can be disabled by globally defining the macro BOOST_BIMAP_DISABLE_SERIALIZATION. | |
366 | Disabling serialization for Boost.MultiIndex can yield a small improvement | |
367 | in build times, and may be necessary in those defective compilers that | |
368 | fail to correctly process Boost.Serialization headers. | |
369 | </p> | |
370 | <div class="warning"><table border="0" summary="Warning"> | |
371 | <tr> | |
372 | <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../../../../doc/src/images/warning.png"></td> | |
373 | <th align="left">Warning</th> | |
374 | </tr> | |
375 | <tr><td align="left" valign="top"><p> | |
376 | Boost.Bimap and Boost.MultiIndex share a lot of serialization code. The | |
377 | macro <code class="computeroutput"><span class="identifier">BOOST_BIMAP_DISABLE_SERIALIZATION</span></code> | |
378 | disables serialization in <span class="bold"><strong>both</strong></span> libraries. | |
379 | The same happens when <code class="computeroutput"><span class="identifier">BOOST_MULTI_INDEX_DISABLE_SERIALIZATION</span></code> | |
380 | is defined. | |
381 | </p></td></tr> | |
382 | </table></div> | |
383 | <p> | |
384 | Retrieving an archived bimap restores not only the elements, but also the | |
385 | order they were arranged in the views of the container. There is an exception | |
386 | to this rule, though: for unordered sets, no guarantee is made about the | |
387 | order in which elements will be iterated in the restored container; in | |
388 | general, it is unwise to rely on the ordering of elements of a hashed view, | |
389 | since it can change in arbitrary ways during insertion or rehashing --this | |
390 | is precisely the reason why hashed indices and TR1 unordered associative | |
391 | containers do not define an equality operator. | |
392 | </p> | |
393 | <p> | |
394 | Iterators of a bimap can also be serialized. Serialization of an iterator | |
395 | must be done only after serializing its corresponding container. | |
396 | </p> | |
397 | </div> | |
398 | <div class="section boost_bimap_bimap_and_boost_boost_libraries_that_work_well_with_boost_bimap_boost_assign"> | |
399 | <div class="titlepage"><div><div><h4 class="title"> | |
400 | <a name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_assign"></a><a class="link" href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_assign" title="Boost.Assign">Boost.Assign</a> | |
401 | </h4></div></div></div> | |
402 | <p> | |
403 | The purpose of this library is to make it easy to fill containers with | |
404 | data by overloading operator,() and operator()(). These two operators make | |
405 | it possible to construct lists of values that are then copied into a container. | |
406 | </p> | |
407 | <p> | |
408 | These lists are particularly useful in learning, testing, and prototyping | |
409 | situations, but can also be handy otherwise. The library comes with predefined | |
410 | operators for the containers of the standard library, but most functionality | |
411 | will work with any standard compliant container. The library also makes | |
412 | it possible to extend user defined types so for example a member function | |
413 | can be called for a list of values instead of its normal arguments. | |
414 | </p> | |
415 | <p> | |
416 | Boost.Assign can be used with bimap containers. The views of a bimap are | |
417 | signature-compatible with their standard counterparts, so we can use other | |
418 | Boost.Assign utilities with them. | |
419 | </p> | |
420 | <p> | |
421 | <a href="../../../../example/bimap_and_boost/assign.cpp" target="_top">Go to source code</a> | |
422 | </p> | |
423 | <p> | |
424 | </p> | |
425 | <pre class="programlisting"> <span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special"><</span> <span class="identifier">multiset_of</span><span class="special"><</span> <span class="keyword">int</span> <span class="special">>,</span> <span class="identifier">list_of</span><span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">></span> <span class="special">></span> <span class="identifier">bm_type</span><span class="special">;</span> | |
426 | ||
427 | <span class="comment">// We can use assign::list_of to initialize the container.</span> | |
428 | ||
429 | <span class="identifier">bm_type</span> <span class="identifier">bm</span> <span class="special">=</span> <span class="identifier">assign</span><span class="special">::</span><span class="identifier">list_of</span><span class="special"><</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">relation</span> <span class="special">></span> <a class="co" name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_assign.c0" href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_assign.c1"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a> | |
430 | <span class="special">(</span> <span class="number">1</span><span class="special">,</span> <span class="string">"one"</span> <span class="special">)</span> | |
431 | <span class="special">(</span> <span class="number">2</span><span class="special">,</span> <span class="string">"two"</span> <span class="special">)</span> | |
432 | <span class="special">(</span> <span class="number">3</span><span class="special">,</span> <span class="string">"three"</span> <span class="special">);</span> | |
433 | ||
434 | <span class="comment">// The left map view is a multiset, again we use insert</span> | |
435 | ||
436 | <span class="identifier">assign</span><span class="special">::</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span> <span class="special">)</span> | |
437 | <span class="special">(</span> <span class="number">4</span><span class="special">,</span> <span class="string">"four"</span> <span class="special">)</span> | |
438 | <span class="special">(</span> <span class="number">5</span><span class="special">,</span> <span class="string">"five"</span> <span class="special">)</span> | |
439 | <span class="special">(</span> <span class="number">6</span><span class="special">,</span> <span class="string">"six"</span> <span class="special">);</span> | |
440 | ||
441 | <span class="comment">// The right map view is a list so we use push_back here</span> | |
442 | <span class="comment">// Note the order of the elements in the list!</span> | |
443 | ||
444 | <span class="identifier">assign</span><span class="special">::</span><span class="identifier">push_back</span><span class="special">(</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">right</span> <span class="special">)</span> | |
445 | <span class="special">(</span> <span class="string">"seven"</span> <span class="special">,</span> <span class="number">7</span> <span class="special">)</span> | |
446 | <span class="special">(</span> <span class="string">"eight"</span> <span class="special">,</span> <span class="number">8</span> <span class="special">);</span> | |
447 | ||
448 | <span class="identifier">assign</span><span class="special">::</span><span class="identifier">push_front</span><span class="special">(</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">right</span> <span class="special">)</span> | |
449 | <span class="special">(</span> <span class="string">"nine"</span> <span class="special">,</span> <span class="number">9</span> <span class="special">)</span> | |
450 | <span class="special">(</span> <span class="string">"ten"</span> <span class="special">,</span> <span class="number">10</span> <span class="special">)</span> | |
451 | <span class="special">(</span> <span class="string">"eleven"</span><span class="special">,</span> <span class="number">11</span> <span class="special">);</span> | |
452 | ||
453 | <span class="comment">// Since it is left_based the main view is a multiset, so we use insert</span> | |
454 | ||
455 | <span class="identifier">assign</span><span class="special">::</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm</span> <span class="special">)</span> | |
456 | <span class="special">(</span> <span class="number">12</span><span class="special">,</span> <span class="string">"twelve"</span> <span class="special">)</span> | |
457 | <span class="special">(</span> <span class="number">13</span><span class="special">,</span> <span class="string">"thirteen"</span> <span class="special">);</span> | |
458 | </pre> | |
459 | <p> | |
460 | </p> | |
461 | <div class="calloutlist"><table border="0" summary="Callout list"><tr> | |
462 | <td width="5%" valign="top" align="left"><p><a name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_assign.c1"></a><a href="#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_assign.c0"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a> </p></td> | |
463 | <td valign="top" align="left"><p> | |
464 | Note that <code class="computeroutput"><span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">relation</span></code> has to be used instead of | |
465 | <code class="computeroutput"><span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span></code>. Contrary to <code class="computeroutput"><span class="identifier">value_type</span></code>, <code class="computeroutput"><span class="identifier">relation</span></code> | |
466 | type stores the elements as non const, a requirement of <code class="computeroutput"><span class="identifier">assign</span><span class="special">::</span><span class="identifier">list_of</span></code> | |
467 | </p></td> | |
468 | </tr></table></div> | |
469 | </div> | |
470 | <div class="section boost_bimap_bimap_and_boost_boost_libraries_that_work_well_with_boost_bimap_boost_hash"> | |
471 | <div class="titlepage"><div><div><h4 class="title"> | |
472 | <a name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_hash"></a><a class="link" href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_hash" title="Boost.Hash">Boost.Hash</a> | |
473 | </h4></div></div></div> | |
474 | <p> | |
475 | The hash function is the very core of the fast lookup capabilities of the | |
476 | unordered sets: a hasher is just a Unary Function returning an std::size_t | |
477 | value for any given key. In general, it is impossible that every key map | |
478 | to a different hash value, for the space of keys can be greater than the | |
479 | number of permissible hash codes: what makes for a good hasher is that | |
480 | the probability of a collision (two different keys with the same hash value) | |
481 | is as close to zero as possible. | |
482 | </p> | |
483 | <p> | |
484 | This is a statistical property depending on the typical distribution of | |
485 | keys in a given application, so it is not feasible to have a general-purpose | |
486 | hash function with excellent results in every possible scenario; the default | |
487 | value for this parameter uses Boost.Hash, which often provides good enough | |
488 | results. | |
489 | </p> | |
490 | <p> | |
491 | Boost.Hash can be <a href="http://www.boost.org/doc/html/hash/custom.html" target="_top">extended | |
492 | for custom data types</a>, enabling to use the default parameter of | |
493 | the unordered set types with any user types. | |
494 | </p> | |
495 | </div> | |
496 | <div class="section boost_bimap_bimap_and_boost_boost_libraries_that_work_well_with_boost_bimap_boost_lambda"> | |
497 | <div class="titlepage"><div><div><h4 class="title"> | |
498 | <a name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_lambda"></a><a class="link" href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_lambda" title="Boost.Lambda">Boost.Lambda</a> | |
499 | </h4></div></div></div> | |
500 | <p> | |
501 | The Boost Lambda Library (BLL in the sequel) is a C++ template library, | |
502 | which implements form of lambda abstractions for C++. The term originates | |
503 | from functional programming and lambda calculus, where a lambda abstraction | |
504 | defines an unnamed function. Lambda expressions are very useful to construct | |
505 | the function objects required by some of the functions in a bimap view. | |
506 | </p> | |
507 | <p> | |
508 | Boost.Bimap defines new placeholders in <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bimap</span><span class="special">/</span><span class="identifier">support</span><span class="special">/</span><span class="identifier">lambda</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> | |
509 | to allow a sounder solution. The placeholders are named _key and _data | |
510 | and both are equivalent to boost::lambda::_1. There are two reasons to | |
511 | include this placeholders: the code looks better with them and they avoid | |
512 | the clash problem between lambda::_1 and boost::_1 from Boost.Bind. | |
513 | </p> | |
514 | <p> | |
515 | <a href="../../../../example/bimap_and_boost/lambda.cpp" target="_top">Go to source code</a> | |
516 | </p> | |
517 | <p> | |
518 | </p> | |
519 | <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">int</span> <span class="special">></span> <span class="identifier">bm_type</span><span class="special">;</span> | |
520 | ||
521 | <span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span> | |
522 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="string">"one"</span><span class="special">,</span><span class="number">1</span><span class="special">)</span> <span class="special">);</span> | |
523 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="string">"two"</span><span class="special">,</span><span class="number">2</span><span class="special">)</span> <span class="special">);</span> | |
524 | ||
525 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">range</span><span class="special">(</span> <span class="number">5</span> <span class="special"><</span> <span class="identifier">_key</span><span class="special">,</span> <span class="identifier">_key</span> <span class="special"><</span> <span class="number">10</span> <span class="special">);</span> | |
526 | ||
527 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">modify_key</span><span class="special">(</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="string">"one"</span><span class="special">),</span> <span class="identifier">_key</span> <span class="special">=</span> <span class="string">"1"</span> <span class="special">);</span> | |
528 | ||
529 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">modify_data</span><span class="special">(</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">_data</span> <span class="special">*=</span> <span class="number">10</span> <span class="special">);</span> | |
530 | </pre> | |
531 | <p> | |
532 | </p> | |
533 | </div> | |
534 | <div class="section boost_bimap_bimap_and_boost_boost_libraries_that_work_well_with_boost_bimap_boost_range"> | |
535 | <div class="titlepage"><div><div><h4 class="title"> | |
536 | <a name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_range"></a><a class="link" href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_range" title="Boost.Range">Boost.Range</a> | |
537 | </h4></div></div></div> | |
538 | <p> | |
539 | Boost.Range is a collection of concepts and utilities that are particularly | |
540 | useful for specifying and implementing generic algorithms. Generic algorithms | |
541 | have so far been specified in terms of two or more iterators. Two iterators | |
542 | would together form a range of values that the algorithm could work on. | |
543 | This leads to a very general interface, but also to a somewhat clumsy use | |
544 | of the algorithms with redundant specification of container names. Therefore | |
545 | we would like to raise the abstraction level for algorithms so they specify | |
546 | their interface in terms of Ranges as much as possible. | |
547 | </p> | |
548 | <p> | |
549 | As Boost.Bimap views are signature-compatible with their standard container | |
550 | counterparts, they are compatible with the concept of a range. As an additional | |
551 | feature, ordered bimap views offer a function named <code class="computeroutput"><span class="identifier">range</span></code> | |
552 | that allows a range of values to be obtained. | |
553 | </p> | |
554 | <p> | |
555 | If we have some generic functions that accepts ranges: | |
556 | </p> | |
557 | <p> | |
558 | </p> | |
559 | <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span> <span class="keyword">class</span> <span class="identifier">ForwardReadableRange</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">UnaryFunctor</span> <span class="special">></span> | |
560 | <span class="identifier">UnaryFunctor</span> <span class="identifier">for_each</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ForwardReadableRange</span> <span class="special">&</span> <span class="identifier">r</span><span class="special">,</span> <span class="identifier">UnaryFunctor</span> <span class="identifier">func</span><span class="special">)</span> | |
561 | <span class="special">{</span> | |
562 | <span class="keyword">typedef</span> <span class="keyword">typename</span> | |
563 | <span class="identifier">boost</span><span class="special">::</span><span class="identifier">range_const_iterator</span><span class="special"><</span><span class="identifier">ForwardReadableRange</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">const_iterator</span><span class="special">;</span> | |
564 | ||
565 | <span class="keyword">for</span><span class="special">(</span><span class="identifier">const_iterator</span> <span class="identifier">i</span><span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">iend</span><span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">);</span> <span class="identifier">i</span><span class="special">!=</span><span class="identifier">iend</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span> <span class="special">)</span> | |
566 | <span class="special">{</span> | |
567 | <span class="identifier">func</span><span class="special">(*</span><span class="identifier">i</span><span class="special">);</span> | |
568 | <span class="special">}</span> | |
569 | ||
570 | <span class="keyword">return</span> <span class="identifier">func</span><span class="special">;</span> | |
571 | <span class="special">}</span> | |
572 | ||
573 | <span class="keyword">template</span><span class="special"><</span> <span class="keyword">class</span> <span class="identifier">ForwardReadableRange</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Predicate</span> <span class="special">></span> | |
574 | <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">range_difference</span><span class="special"><</span><span class="identifier">ForwardReadableRange</span><span class="special">>::</span><span class="identifier">type</span> | |
575 | <span class="identifier">count_if</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">ForwardReadableRange</span> <span class="special">&</span> <span class="identifier">r</span><span class="special">,</span> <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span> | |
576 | <span class="special">{</span> | |
577 | <span class="keyword">typedef</span> <span class="keyword">typename</span> | |
578 | <span class="identifier">boost</span><span class="special">::</span><span class="identifier">range_const_iterator</span><span class="special"><</span><span class="identifier">ForwardReadableRange</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">const_iterator</span><span class="special">;</span> | |
579 | ||
580 | <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">range_difference</span><span class="special"><</span><span class="identifier">ForwardReadableRange</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">c</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> | |
581 | ||
582 | <span class="keyword">for</span><span class="special">(</span> <span class="identifier">const_iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">iend</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">);</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">iend</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span> <span class="special">)</span> | |
583 | <span class="special">{</span> | |
584 | <span class="keyword">if</span><span class="special">(</span> <span class="identifier">pred</span><span class="special">(*</span><span class="identifier">i</span><span class="special">)</span> <span class="special">)</span> <span class="special">++</span><span class="identifier">c</span><span class="special">;</span> | |
585 | <span class="special">}</span> | |
586 | ||
587 | <span class="keyword">return</span> <span class="identifier">c</span><span class="special">;</span> | |
588 | <span class="special">}</span> | |
589 | </pre> | |
590 | <p> | |
591 | </p> | |
592 | <p> | |
593 | We can use them with Boost.Bimap with the help of the <code class="computeroutput"><span class="identifier">range</span></code> | |
594 | function. | |
595 | </p> | |
596 | <p> | |
597 | </p> | |
598 | <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">pair_printer</span> | |
599 | <span class="special">{</span> | |
600 | <span class="identifier">pair_printer</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span> <span class="special">&</span> <span class="identifier">o</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">os</span><span class="special">(</span><span class="identifier">o</span><span class="special">)</span> <span class="special">{}</span> | |
601 | <span class="keyword">template</span><span class="special"><</span> <span class="keyword">class</span> <span class="identifier">Pair</span> <span class="special">></span> | |
602 | <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">Pair</span> <span class="special">&</span> <span class="identifier">p</span><span class="special">)</span> | |
603 | <span class="special">{</span> | |
604 | <span class="identifier">os</span> <span class="special"><<</span> <span class="string">"("</span> <span class="special"><<</span> <span class="identifier">p</span><span class="special">.</span><span class="identifier">first</span> <span class="special"><<</span> <span class="string">","</span> <span class="special"><<</span> <span class="identifier">p</span><span class="special">.</span><span class="identifier">second</span> <span class="special"><<</span> <span class="string">")"</span><span class="special">;</span> | |
605 | <span class="special">}</span> | |
606 | <span class="keyword">private</span><span class="special">:</span> | |
607 | <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span> <span class="special">&</span> <span class="identifier">os</span><span class="special">;</span> | |
608 | <span class="special">};</span> | |
609 | ||
610 | <span class="keyword">struct</span> <span class="identifier">second_extractor</span> | |
611 | <span class="special">{</span> | |
612 | <span class="keyword">template</span><span class="special"><</span> <span class="keyword">class</span> <span class="identifier">Pair</span> <span class="special">></span> | |
613 | <span class="keyword">const</span> <span class="keyword">typename</span> <span class="identifier">Pair</span><span class="special">::</span><span class="identifier">second_type</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">Pair</span> <span class="special">&</span> <span class="identifier">p</span><span class="special">)</span> | |
614 | <span class="special">{</span> | |
615 | <span class="keyword">return</span> <span class="identifier">p</span><span class="special">.</span><span class="identifier">second</span><span class="special">;</span> | |
616 | <span class="special">}</span> | |
617 | <span class="special">};</span> | |
618 | ||
619 | <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> | |
620 | <span class="special">{</span> | |
621 | <span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special"><</span> <span class="keyword">double</span><span class="special">,</span> <span class="identifier">multiset_of</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="special">></span> <span class="identifier">bm_type</span><span class="special">;</span> | |
622 | ||
623 | <span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span> | |
624 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="number">2.5</span> <span class="special">,</span> <span class="number">1</span><span class="special">)</span> <span class="special">);</span> | |
625 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="number">3.1</span> <span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="special">);</span> | |
626 | <span class="comment">//...</span> | |
627 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="number">6.4</span> <span class="special">,</span> <span class="number">4</span><span class="special">)</span> <span class="special">);</span> | |
628 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="number">1.7</span> <span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="special">);</span> | |
629 | ||
630 | <span class="comment">// Print all the elements of the left map view</span> | |
631 | ||
632 | <span class="identifier">for_each</span><span class="special">(</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span><span class="special">,</span> <span class="identifier">pair_printer</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">)</span> <span class="special">);</span> | |
633 | ||
634 | <span class="comment">// Print a range of elements of the right map view</span> | |
635 | ||
636 | <span class="identifier">for_each</span><span class="special">(</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">range</span><span class="special">(</span> <span class="number">2</span> <span class="special"><=</span> <span class="identifier">_key</span><span class="special">,</span> <span class="identifier">_key</span> <span class="special"><</span> <span class="number">6</span> <span class="special">),</span> <span class="identifier">pair_printer</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">)</span> <span class="special">);</span> | |
637 | ||
638 | <span class="comment">// Count the number of elements where the data is equal to 2 from a</span> | |
639 | <span class="comment">// range of elements of the left map view</span> | |
640 | ||
641 | <span class="identifier">count_if</span><span class="special">(</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">range</span><span class="special">(</span> <span class="number">2.3</span> <span class="special"><</span> <span class="identifier">_key</span><span class="special">,</span> <span class="identifier">_key</span> <span class="special"><</span> <span class="number">5.4</span> <span class="special">),</span> | |
642 | <span class="identifier">bind</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span> <span class="identifier">second_extractor</span><span class="special">(),</span> <span class="identifier">_1</span> <span class="special">)</span> <span class="special">==</span> <span class="number">2</span> <span class="special">);</span> | |
643 | ||
644 | <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> | |
645 | <span class="special">}</span> | |
646 | </pre> | |
647 | <p> | |
648 | </p> | |
649 | <p> | |
650 | <a href="../../../../example/bimap_and_boost/range.cpp" target="_top">Go to source code</a> | |
651 | </p> | |
652 | </div> | |
653 | <div class="section boost_bimap_bimap_and_boost_boost_libraries_that_work_well_with_boost_bimap_boost_foreach"> | |
654 | <div class="titlepage"><div><div><h4 class="title"> | |
655 | <a name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_foreach"></a><a class="link" href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_foreach" title="Boost.Foreach">Boost.Foreach</a> | |
656 | </h4></div></div></div> | |
657 | <p> | |
658 | In C++, writing a loop that iterates over a sequence is tedious. We can | |
659 | either use iterators, which requires a considerable amount of boiler-plate, | |
660 | or we can use the std::for_each() algorithm and move our loop body into | |
661 | a predicate, which requires no less boiler-plate and forces us to move | |
662 | our logic far from where it will be used. In contrast, some other languages, | |
663 | like Perl, provide a dedicated "foreach" construct that automates | |
664 | this process. BOOST_FOREACH is just such a construct for C++. It iterates | |
665 | over sequences for us, freeing us from having to deal directly with iterators | |
666 | or write predicates. | |
667 | </p> | |
668 | <p> | |
669 | You can use BOOST_FOREACH macro with Boost.Bimap views. The generated code | |
670 | will be as efficient as a std::for_each iteration. Here are some examples: | |
671 | </p> | |
672 | <p> | |
673 | </p> | |
674 | <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="identifier">list_of</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="special">></span> <span class="identifier">bm_type</span><span class="special">;</span> | |
675 | ||
676 | <span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span> | |
677 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="string">"1"</span><span class="special">,</span> <span class="number">1</span><span class="special">)</span> <span class="special">);</span> | |
678 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="string">"2"</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="special">);</span> | |
679 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="string">"3"</span><span class="special">,</span> <span class="number">4</span><span class="special">)</span> <span class="special">);</span> | |
680 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="string">"4"</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="special">);</span> | |
681 | ||
682 | <span class="identifier">BOOST_FOREACH</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">left_reference</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span> <span class="special">)</span> | |
683 | <span class="special">{</span> | |
684 | <span class="special">++</span><span class="identifier">p</span><span class="special">.</span><span class="identifier">second</span><span class="special">;</span> <a class="co" name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_foreach.c0" href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_foreach.c1"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a> | |
685 | <span class="special">}</span> | |
686 | ||
687 | <span class="identifier">BOOST_FOREACH</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">right_const_reference</span> <span class="identifier">p</span><span class="special">,</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">right</span> <span class="special">)</span> | |
688 | <span class="special">{</span> | |
689 | <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">p</span><span class="special">.</span><span class="identifier">first</span> <span class="special"><<</span> <span class="string">"-->"</span> <span class="special"><<</span> <span class="identifier">p</span><span class="special">.</span><span class="identifier">second</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> | |
690 | <span class="special">}</span> | |
691 | </pre> | |
692 | <p> | |
693 | </p> | |
694 | <div class="calloutlist"><table border="0" summary="Callout list"><tr> | |
695 | <td width="5%" valign="top" align="left"><p><a name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_foreach.c1"></a><a href="#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_foreach.c0"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a> </p></td> | |
696 | <td valign="top" align="left"><p> | |
697 | We can modify the right element because we have use a mutable collection | |
698 | type in the right side. | |
699 | </p></td> | |
700 | </tr></table></div> | |
701 | <p> | |
702 | You can use it directly with ranges too: | |
703 | </p> | |
704 | <p> | |
705 | </p> | |
706 | <pre class="programlisting"><span class="identifier">BOOST_FOREACH</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">left_reference</span> <span class="identifier">p</span><span class="special">,</span> | |
707 | <span class="special">(</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">range</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(</span><span class="string">"1"</span><span class="special">)</span> <span class="special"><=</span> <span class="identifier">_key</span><span class="special">,</span> <span class="identifier">_key</span> <span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(</span><span class="string">"3"</span><span class="special">)</span> <span class="special">)</span> <span class="special">))</span> | |
708 | <span class="special">{</span> | |
709 | <span class="special">++</span><span class="identifier">p</span><span class="special">.</span><span class="identifier">second</span><span class="special">;</span> | |
710 | <span class="special">}</span> | |
711 | ||
712 | <span class="identifier">BOOST_FOREACH</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">left_const_reference</span> <span class="identifier">p</span><span class="special">,</span> | |
713 | <span class="special">(</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">range</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(</span><span class="string">"1"</span><span class="special">)</span> <span class="special"><=</span> <span class="identifier">_key</span><span class="special">,</span> <span class="identifier">_key</span> <span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(</span><span class="string">"3"</span><span class="special">)</span> <span class="special">)</span> <span class="special">))</span> | |
714 | <span class="special">{</span> | |
715 | <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">p</span><span class="special">.</span><span class="identifier">first</span> <span class="special"><<</span> <span class="string">"-->"</span> <span class="special"><<</span> <span class="identifier">p</span><span class="special">.</span><span class="identifier">second</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> | |
716 | <span class="special">}</span> | |
717 | </pre> | |
718 | <p> | |
719 | </p> | |
720 | <p> | |
721 | <a href="../../../../example/bimap_and_boost/foreach.cpp" target="_top">Go to source code</a> | |
722 | </p> | |
723 | </div> | |
724 | <div class="section boost_bimap_bimap_and_boost_boost_libraries_that_work_well_with_boost_bimap_boost_typeof"> | |
725 | <div class="titlepage"><div><div><h4 class="title"> | |
726 | <a name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_typeof"></a><a class="link" href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_typeof" title="Boost.Typeof">Boost.Typeof</a> | |
727 | </h4></div></div></div> | |
728 | <p> | |
729 | Once C++0x is out we are going to be able to write code like: | |
730 | </p> | |
731 | <pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">iter</span> <span class="special">=</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">by</span><span class="special"><</span><span class="identifier">name</span><span class="special">>().</span><span class="identifier">find</span><span class="special">(</span><span class="string">"john"</span><span class="special">);</span> | |
732 | </pre> | |
733 | <p> | |
734 | instead of the more verbose | |
735 | </p> | |
736 | <pre class="programlisting"><span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">map_by</span><span class="special"><</span><span class="identifier">name</span><span class="special">>::</span><span class="identifier">iterator</span> <span class="identifier">iter</span> <span class="special">=</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">by</span><span class="special"><</span><span class="identifier">name</span><span class="special">>().</span><span class="identifier">find</span><span class="special">(</span><span class="string">"john"</span><span class="special">);</span> | |
737 | </pre> | |
738 | <p> | |
739 | Boost.Typeof defines a macro BOOST_AUTO that can be used as a library solution | |
740 | to the auto keyword while we wait for the next standard. | |
741 | </p> | |
742 | <p> | |
743 | If we have | |
744 | </p> | |
745 | <p> | |
746 | </p> | |
747 | <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special"><</span> <span class="identifier">tagged</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span><span class="identifier">name</span><span class="special">>,</span> <span class="identifier">tagged</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span><span class="identifier">number</span><span class="special">></span> <span class="special">></span> <span class="identifier">bm_type</span><span class="special">;</span> | |
748 | <span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span> | |
749 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="string">"one"</span> <span class="special">,</span><span class="number">1</span><span class="special">)</span> <span class="special">);</span> | |
750 | <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="string">"two"</span> <span class="special">,</span><span class="number">2</span><span class="special">)</span> <span class="special">);</span> | |
751 | </pre> | |
752 | <p> | |
753 | </p> | |
754 | <p> | |
755 | The following code snippet | |
756 | </p> | |
757 | <p> | |
758 | </p> | |
759 | <pre class="programlisting"><span class="keyword">for</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">map_by</span><span class="special"><</span><span class="identifier">name</span><span class="special">>::</span><span class="identifier">iterator</span> <span class="identifier">iter</span> <span class="special">=</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">by</span><span class="special"><</span><span class="identifier">name</span><span class="special">>().</span><span class="identifier">begin</span><span class="special">();</span> | |
760 | <span class="identifier">iter</span><span class="special">!=</span><span class="identifier">bm</span><span class="special">.</span><span class="identifier">by</span><span class="special"><</span><span class="identifier">name</span><span class="special">>().</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">iter</span><span class="special">)</span> | |
761 | <span class="special">{</span> | |
762 | <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">iter</span><span class="special">-></span><span class="identifier">first</span> <span class="special"><<</span> <span class="string">" --> "</span> <span class="special"><<</span> <span class="identifier">iter</span><span class="special">-></span><span class="identifier">second</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> | |
763 | <span class="special">}</span> | |
764 | ||
765 | <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">map_by</span><span class="special"><</span><span class="identifier">number</span><span class="special">>::</span><span class="identifier">iterator</span> <span class="identifier">iter</span> <span class="special">=</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">by</span><span class="special"><</span><span class="identifier">number</span><span class="special">>().</span><span class="identifier">find</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> | |
766 | <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"2: "</span> <span class="special"><<</span> <span class="identifier">iter</span><span class="special">-></span><span class="identifier">get</span><span class="special"><</span><span class="identifier">name</span><span class="special">>();</span> | |
767 | </pre> | |
768 | <p> | |
769 | </p> | |
770 | <p> | |
771 | can be rewrited as | |
772 | </p> | |
773 | <p> | |
774 | </p> | |
775 | <pre class="programlisting"><span class="keyword">for</span><span class="special">(</span> <span class="identifier">BOOST_AUTO</span><span class="special">(</span><span class="identifier">iter</span><span class="special">,</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">by</span><span class="special"><</span><span class="identifier">name</span><span class="special">>().</span><span class="identifier">begin</span><span class="special">());</span> <span class="identifier">iter</span><span class="special">!=</span><span class="identifier">bm</span><span class="special">.</span><span class="identifier">by</span><span class="special"><</span><span class="identifier">name</span><span class="special">>().</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">iter</span><span class="special">)</span> | |
776 | <span class="special">{</span> | |
777 | <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">iter</span><span class="special">-></span><span class="identifier">first</span> <span class="special"><<</span> <span class="string">" --> "</span> <span class="special"><<</span> <span class="identifier">iter</span><span class="special">-></span><span class="identifier">second</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> | |
778 | <span class="special">}</span> | |
779 | ||
780 | <span class="identifier">BOOST_AUTO</span><span class="special">(</span> <span class="identifier">iter</span><span class="special">,</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">by</span><span class="special"><</span><span class="identifier">number</span><span class="special">>().</span><span class="identifier">find</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special">);</span> | |
781 | <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"2: "</span> <span class="special"><<</span> <span class="identifier">iter</span><span class="special">-></span><span class="identifier">get</span><span class="special"><</span><span class="identifier">name</span><span class="special">>();</span> | |
782 | </pre> | |
783 | <p> | |
784 | </p> | |
785 | <p> | |
786 | <a href="../../../../example/bimap_and_boost/typeof.cpp" target="_top">Go to source code</a> | |
787 | </p> | |
788 | </div> | |
789 | <div class="section boost_bimap_bimap_and_boost_boost_libraries_that_work_well_with_boost_bimap_boost_xpressive"> | |
790 | <div class="titlepage"><div><div><h4 class="title"> | |
791 | <a name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_xpressive"></a><a class="link" href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_xpressive" title="Boost.Xpressive">Boost.Xpressive</a> | |
792 | </h4></div></div></div> | |
793 | <p> | |
794 | Using Boost.Xpressive we can parse a file and insert the relations in a | |
795 | bimap in the same step. It is just amazing the power of four lines of code. | |
796 | Here is an example (it is just beatifull) | |
797 | </p> | |
798 | <p> | |
799 | </p> | |
800 | <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">int</span> <span class="special">></span> <span class="identifier">bm_type</span><span class="special">;</span> | |
801 | <span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span> | |
802 | ||
803 | <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">rel_str</span><span class="special">(</span><span class="string">"one <--> 1 two <--> 2 three <--> 3"</span><span class="special">);</span> | |
804 | ||
805 | <span class="identifier">sregex</span> <span class="identifier">rel</span> <span class="special">=</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">s1</span><span class="special">=</span> <span class="special">+</span><span class="identifier">_w</span><span class="special">)</span> <span class="special">>></span> <span class="string">" <--> "</span> <span class="special">>></span> <span class="special">(</span><span class="identifier">s2</span><span class="special">=</span> <span class="special">+</span><span class="identifier">_d</span><span class="special">)</span> <span class="special">)</span> | |
806 | <span class="special">[</span> | |
807 | <span class="identifier">xp</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">bm</span><span class="special">)->*</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">xp</span><span class="special">::</span><span class="identifier">construct</span><span class="special"><</span><span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">>(</span><span class="identifier">s1</span><span class="special">,</span> <span class="identifier">as</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="identifier">s2</span><span class="special">))</span> <span class="special">)</span> | |
808 | <span class="special">];</span> | |
809 | ||
810 | <span class="identifier">sregex</span> <span class="identifier">relations</span> <span class="special">=</span> <span class="identifier">rel</span> <span class="special">>></span> <span class="special">*(+</span><span class="identifier">_s</span> <span class="special">>></span> <span class="identifier">rel</span><span class="special">);</span> | |
811 | ||
812 | <span class="identifier">regex_match</span><span class="special">(</span><span class="identifier">rel_str</span><span class="special">,</span> <span class="identifier">relations</span><span class="special">);</span> | |
813 | ||
814 | <span class="identifier">assert</span><span class="special">(</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span> <span class="special">);</span> | |
815 | </pre> | |
816 | <p> | |
817 | </p> | |
818 | <p> | |
819 | <a href="../../../../example/bimap_and_boost/xpressive.cpp" target="_top">Go to source code</a> | |
820 | </p> | |
821 | </div> | |
822 | <div class="section boost_bimap_bimap_and_boost_boost_libraries_that_work_well_with_boost_bimap_boost_property_map"> | |
823 | <div class="titlepage"><div><div><h4 class="title"> | |
824 | <a name="boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_property_map"></a><a class="link" href="boost_libraries_that_work_well_with_boost_bimap.html#boost_bimap.bimap_and_boost.boost_libraries_that_work_well_with_boost_bimap.boost_property_map" title="Boost.Property_map">Boost.Property_map</a> | |
825 | </h4></div></div></div> | |
826 | <p> | |
827 | The Boost Property Map Library consists mainly of interface specifications | |
828 | in the form of concepts (similar to the iterator concepts in the STL). | |
829 | These interface specifications are intended for use by implementers of | |
830 | generic libraries in communicating requirements on template parameters | |
831 | to their users. In particular, the Boost Property Map concepts define a | |
832 | general purpose interface for mapping key objects to corresponding value | |
833 | objects, thereby hiding the details of how the mapping is implemented from | |
834 | algorithms. | |
835 | </p> | |
836 | <p> | |
837 | The need for the property map interface came from the Boost Graph Library | |
838 | (BGL), which contains many examples of algorithms that use the property | |
839 | map concepts to specify their interface. For an example, note the ColorMap | |
840 | template parameter of the breadth_first_search. In addition, the BGL contains | |
841 | many examples of concrete types that implement the property map interface. | |
842 | The adjacency_list class implements property maps for accessing objects | |
843 | (properties) that are attached to vertices and edges of the graph. | |
844 | </p> | |
845 | <p> | |
846 | The counterparts of two of the views of Boost.Bimap map, the <code class="computeroutput"><span class="identifier">set</span></code> and <code class="computeroutput"><span class="identifier">unordered_set</span></code>, | |
847 | are read-write property maps. In order to use these, you need to include | |
848 | one of the following headers: | |
849 | </p> | |
850 | <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bimap</span><span class="special">/</span><span class="identifier">property_map</span><span class="special">/</span><span class="identifier">set_support</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> | |
851 | <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bimap</span><span class="special">/</span><span class="identifier">property_map</span><span class="special">/</span><span class="identifier">unordered_set_support</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> | |
852 | </pre> | |
853 | <p> | |
854 | The following is adapted from the example in the Boost.PropertyMap documentation. | |
855 | </p> | |
856 | <p> | |
857 | <a href="../../../../example/bimap_and_boost/property_map.cpp" target="_top">Go to source | |
858 | code</a> | |
859 | </p> | |
860 | <p> | |
861 | </p> | |
862 | <pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">AddressMap</span><span class="special">></span> | |
863 | <span class="keyword">void</span> <span class="identifier">foo</span><span class="special">(</span><span class="identifier">AddressMap</span> <span class="special">&</span> <span class="identifier">address_map</span><span class="special">)</span> | |
864 | <span class="special">{</span> | |
865 | <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">property_traits</span><span class="special"><</span><span class="identifier">AddressMap</span><span class="special">>::</span><span class="identifier">value_type</span> <span class="identifier">value_type</span><span class="special">;</span> | |
866 | <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">property_traits</span><span class="special"><</span><span class="identifier">AddressMap</span><span class="special">>::</span><span class="identifier">key_type</span> <span class="identifier">key_type</span><span class="special">;</span> | |
867 | ||
868 | <span class="identifier">value_type</span> <span class="identifier">address</span><span class="special">;</span> | |
869 | <span class="identifier">key_type</span> <span class="identifier">fred</span> <span class="special">=</span> <span class="string">"Fred"</span><span class="special">;</span> | |
870 | <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">address_map</span><span class="special">,</span> <span class="identifier">fred</span><span class="special">);</span> | |
871 | <span class="special">}</span> | |
872 | ||
873 | <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> | |
874 | <span class="special">{</span> | |
875 | <span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="identifier">multiset_of</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">></span> <span class="special">></span> <span class="identifier">Name2Address</span><span class="special">;</span> | |
876 | <span class="keyword">typedef</span> <span class="identifier">Name2Address</span><span class="special">::</span><span class="identifier">value_type</span> <span class="identifier">location</span><span class="special">;</span> | |
877 | ||
878 | <span class="identifier">Name2Address</span> <span class="identifier">name2address</span><span class="special">;</span> | |
879 | <span class="identifier">name2address</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">location</span><span class="special">(</span><span class="string">"Fred"</span><span class="special">,</span> <span class="string">"710 West 13th Street"</span><span class="special">)</span> <span class="special">);</span> | |
880 | <span class="identifier">name2address</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">location</span><span class="special">(</span> <span class="string">"Joe"</span><span class="special">,</span> <span class="string">"710 West 13th Street"</span><span class="special">)</span> <span class="special">);</span> | |
881 | ||
882 | <span class="identifier">foo</span><span class="special">(</span> <span class="identifier">name2address</span><span class="special">.</span><span class="identifier">left</span> <span class="special">);</span> | |
883 | ||
884 | <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> | |
885 | <span class="special">}</span> | |
886 | </pre> | |
887 | <p> | |
888 | </p> | |
889 | </div> | |
890 | </div> | |
891 | <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> | |
892 | <td align="left"></td> | |
893 | <td align="right"><div class="copyright-footer">Copyright © 2006-2012 Matias Capeletto<p> | |
894 | Distributed under the Boost Software License, Version 1.0. (See accompanying | |
895 | file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) | |
896 | </p> | |
897 | </div></td> | |
898 | </tr></table> | |
899 | <hr> | |
900 | <div class="spirit-nav"> | |
901 | <a accesskey="p" href="../bimap_and_boost.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../bimap_and_boost.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="dependencies.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> | |
902 | </div> | |
903 | </body> | |
904 | </html> |