]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/bimap/doc/html/boost_bimap/the_tutorial/controlling_collection_types.html
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / bimap / doc / html / boost_bimap / the_tutorial / controlling_collection_types.html
CommitLineData
7c673cae
FG
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4<title>Controlling collection types</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&#160;1.&#160;Boost.Bimap">
8<link rel="up" href="../the_tutorial.html" title="The tutorial">
9<link rel="prev" href="discovering_the_bimap_framework.html" title="Discovering the bimap framework">
10<link rel="next" href="the_collection_of_relations_type.html" title="The collection of relations type">
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="discovering_the_bimap_framework.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../the_tutorial.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="the_collection_of_relations_type.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section boost_bimap_the_tutorial_controlling_collection_types">
26<div class="titlepage"><div><div><h3 class="title">
27<a name="boost_bimap.the_tutorial.controlling_collection_types"></a><a class="link" href="controlling_collection_types.html" title="Controlling collection types">Controlling
28 collection types</a>
29</h3></div></div></div>
30<div class="toc"><dl>
31<dt><span class="section"><a href="controlling_collection_types.html#boost_bimap.the_tutorial.controlling_collection_types.freedom_of_choice">Freedom
32 of choice</a></span></dt>
33<dt><span class="section"><a href="controlling_collection_types.html#boost_bimap.the_tutorial.controlling_collection_types.configuration_parameters">Configuration
34 parameters</a></span></dt>
35<dt><span class="section"><a href="controlling_collection_types.html#boost_bimap.the_tutorial.controlling_collection_types.examples">Examples</a></span></dt>
36</dl></div>
37<div class="section boost_bimap_the_tutorial_controlling_collection_types_freedom_of_choice">
38<div class="titlepage"><div><div><h4 class="title">
39<a name="boost_bimap.the_tutorial.controlling_collection_types.freedom_of_choice"></a><a class="link" href="controlling_collection_types.html#boost_bimap.the_tutorial.controlling_collection_types.freedom_of_choice" title="Freedom of choice">Freedom
40 of choice</a>
41</h4></div></div></div>
42<p>
43 As has already been said, in STL maps, you can only control the constraints
44 from one of the collections, namely the one that you are viewing. In Boost.Bimap,
45 you can control both and it is as easy as using the STL.
46 </p>
47<p>
48 <span class="inlinemediaobject"><img src="../../images/bimap/extended.mapping.framework.png" alt="extended.mapping.framework"></span>
49 </p>
50<p>
51 The idea is to use the same constraint names that are used in the standard.
52 If you don't specify the collection type, Boost.Bimap assumes that the
53 collection is a set. The instantiation of a bimap with custom collection
54 types looks like this:
55 </p>
56<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special">&lt;</span> <span class="bold"><strong>CollectionType</strong></span><span class="identifier">_of</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;,</span> <span class="bold"><strong>CollectionType</strong></span><span class="identifier">_of</span><span class="special">&lt;</span><span class="identifier">B</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">bm_type</span><span class="special">;</span>
57</pre>
58<p>
59 The following is the list of all supported collection types.
60 </p>
61<div class="table">
62<a name="boost_bimap.the_tutorial.controlling_collection_types.freedom_of_choice.t0"></a><p class="title"><b>Table&#160;1.2.&#160;Collection of Key Types</b></p>
63<div class="table-contents"><table class="table" summary="Collection of Key Types">
64<colgroup>
65<col>
66<col>
67<col>
68</colgroup>
69<thead><tr>
70<th>
71 <p>
72 name
73 </p>
74 </th>
75<th>
76 <p>
77 Features
78 </p>
79 </th>
80<th>
81 <p>
82 map view type
83 </p>
84 </th>
85</tr></thead>
86<tbody>
87<tr>
88<td>
89 <p>
90 <code class="computeroutput"><span class="identifier">set_of</span></code>
91 </p>
92 </td>
93<td>
94 <p>
95 <span class="emphasis"><em>ordered, unique</em></span>
96 </p>
97 </td>
98<td>
99 <p>
100 <code class="computeroutput"><span class="identifier">map</span></code>
101 </p>
102 </td>
103</tr>
104<tr>
105<td>
106 <p>
107 <code class="computeroutput"><span class="identifier">multiset_of</span></code>
108 </p>
109 </td>
110<td>
111 <p>
112 <span class="emphasis"><em>ordered </em></span>
113 </p>
114 </td>
115<td>
116 <p>
117 <code class="computeroutput"><span class="identifier">multimap</span></code>
118 </p>
119 </td>
120</tr>
121<tr>
122<td>
123 <p>
124 <code class="computeroutput"><span class="identifier">unordered_set_of</span></code>
125 </p>
126 </td>
127<td>
128 <p>
129 <span class="emphasis"><em>hashed, unique </em></span>
130 </p>
131 </td>
132<td>
133 <p>
134 <code class="computeroutput"><span class="identifier">unordered_map</span></code>
135 </p>
136 </td>
137</tr>
138<tr>
139<td>
140 <p>
141 <code class="computeroutput"><span class="identifier">unordered_multiset_of</span></code>
142 </p>
143 </td>
144<td>
145 <p>
146 <span class="emphasis"><em>hashed </em></span>
147 </p>
148 </td>
149<td>
150 <p>
151 <code class="computeroutput"><span class="identifier">unordered_multimap</span></code>
152 </p>
153 </td>
154</tr>
155<tr>
156<td>
157 <p>
158 <code class="computeroutput"><span class="identifier">list_of</span></code>
159 </p>
160 </td>
161<td>
162 <p>
163 <span class="emphasis"><em>sequenced </em></span>
164 </p>
165 </td>
166<td>
167 <p>
168 <code class="computeroutput"><span class="identifier">list_map</span></code>
169 </p>
170 </td>
171</tr>
172<tr>
173<td>
174 <p>
175 <code class="computeroutput"><span class="identifier">vector_of</span></code>
176 </p>
177 </td>
178<td>
179 <p>
180 <span class="emphasis"><em>random access </em></span>
181 </p>
182 </td>
183<td>
184 <p>
185 <code class="computeroutput"><span class="identifier">vector_map</span></code>
186 </p>
187 </td>
188</tr>
189<tr>
190<td>
191 <p>
192 <code class="computeroutput"><span class="identifier">unconstrained_set_of</span></code>
193 </p>
194 </td>
195<td>
196 <p>
197 <span class="emphasis"><em>unconstrained </em></span>
198 </p>
199 </td>
200<td>
201 <p>
202 <span class="emphasis"><em>can not be viewed</em></span>
203 </p>
204 </td>
205</tr>
206</tbody>
207</table></div>
208</div>
209<br class="table-break"><p>
210 <code class="computeroutput"><span class="identifier">list_of</span></code> and <code class="computeroutput"><span class="identifier">vector_of</span></code> map views are not associated
211 with any existing STL associative containers. They are two examples of
212 unsorted associative containers. <code class="computeroutput"><span class="identifier">unconstrained_set_of</span></code>
213 allow the user to ignore a view. This will be explained later.
214 </p>
215<p>
216 <span class="inlinemediaobject"><img src="../../images/bimap/bimap.structures.png" alt="bimap.structures"></span>
217 </p>
218<p>
219 The selection of the collection type affects the possible operations that
220 you can perform with each side of the bimap and the time it takes to do
221 each. If we have:
222 </p>
223<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special">&lt;</span> <span class="bold"><strong>CollectionType</strong></span><span class="identifier">_of</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;,</span> <span class="bold"><strong>CollectionType</strong></span><span class="identifier">_of</span><span class="special">&lt;</span><span class="identifier">B</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">bm_type</span><span class="special">;</span>
224<span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span>
225</pre>
226<p>
227 The following now describes the resulting map views of the bidirectional
228 map.
229 </p>
230<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
231<li class="listitem">
232 <code class="computeroutput"><span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span></code> is signature-compatible with
233 <span class="bold"><strong>LeftMapType</strong></span><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span><span class="identifier">B</span><span class="special">&gt;</span></code>
234 </li>
235<li class="listitem">
236 <code class="computeroutput"><span class="identifier">bm</span><span class="special">.</span><span class="identifier">right</span></code> is signature-compatible with
237 <span class="bold"><strong>RightMapType</strong></span><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">B</span><span class="special">,</span><span class="identifier">A</span><span class="special">&gt;</span></code>
238 </li>
239</ul></div>
240</div>
241<div class="section boost_bimap_the_tutorial_controlling_collection_types_configuration_parameters">
242<div class="titlepage"><div><div><h4 class="title">
243<a name="boost_bimap.the_tutorial.controlling_collection_types.configuration_parameters"></a><a class="link" href="controlling_collection_types.html#boost_bimap.the_tutorial.controlling_collection_types.configuration_parameters" title="Configuration parameters">Configuration
244 parameters</a>
245</h4></div></div></div>
246<p>
247 Each collection type template has different parameters to control its behaviour.
248 For example, in <code class="computeroutput"><span class="identifier">set_of</span></code>
249 specification, you can pass a Functor type that compares two types. All
250 of these parameters are exactly the same as those of the standard library
251 container, except for the allocator type. You will learn later how to change
252 the allocator for a bimap.
253 </p>
254<p>
255 The following table lists the meanings of each collection type's parameters.
256 </p>
257<div class="informaltable"><table class="table">
258<colgroup>
259<col>
260<col>
261</colgroup>
262<thead><tr>
263<th>
264 <p>
265 name
266 </p>
267 </th>
268<th>
269 <p>
270 Additional Parameters
271 </p>
272 </th>
273</tr></thead>
274<tbody>
275<tr>
276<td>
277 <p>
278 <code class="computeroutput"><span class="identifier">set_of</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">KeyComp</span><span class="special">&gt;</span></code>
279 </p>
280 <p>
281 <code class="computeroutput"><span class="identifier">multiset_of</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">KeyComp</span><span class="special">&gt;</span></code>
282 </p>
283 </td>
284<td>
285 <p>
286 <span class="bold"><strong>KeyComp </strong></span> is a Functor that compares
287 two types using a less-than operator. By default, this is <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">less</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>.
288 </p>
289 </td>
290</tr>
291<tr>
292<td>
293 <p>
294 <code class="computeroutput"><span class="identifier">unordered_set_of</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">HashFunctor</span><span class="special">,</span><span class="identifier">EqualKey</span><span class="special">&gt;</span></code>
295 </p>
296 <p>
297 <code class="computeroutput"><span class="identifier">unordered_multiset_of</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">HashFunctor</span><span class="special">,</span><span class="identifier">EqualKey</span><span class="special">&gt;</span></code>
298 </p>
299 </td>
300<td>
301 <p>
302 <span class="bold"><strong>HashFunctor </strong></span> converts a <code class="computeroutput"><span class="identifier">T</span></code> object into an <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span></code> value. By default it
303 is <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">hash</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>.
304 </p>
305 <p>
306 <span class="bold"><strong>EqualKey </strong></span> is a Functor that
307 tests two types for equality. By default, the equality operator
308 is <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>.
309 </p>
310 </td>
311</tr>
312<tr>
313<td>
314 <p>
315 <code class="computeroutput"><span class="identifier">list_of</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
316 </p>
317 </td>
318<td>
319 <p>
320 No additional parameters.
321 </p>
322 </td>
323</tr>
324<tr>
325<td>
326 <p>
327 <code class="computeroutput"><span class="identifier">vector_of</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
328 </p>
329 </td>
330<td>
331 <p>
332 No additional parameters.
333 </p>
334 </td>
335</tr>
336<tr>
337<td>
338 <p>
339 <code class="computeroutput"><span class="identifier">unconstrained_set_of</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
340 </p>
341 </td>
342<td>
343 <p>
344 No additional parameters.
345 </p>
346 </td>
347</tr>
348</tbody>
349</table></div>
350</div>
351<div class="section boost_bimap_the_tutorial_controlling_collection_types_examples">
352<div class="titlepage"><div><div><h4 class="title">
353<a name="boost_bimap.the_tutorial.controlling_collection_types.examples"></a><a class="link" href="controlling_collection_types.html#boost_bimap.the_tutorial.controlling_collection_types.examples" title="Examples">Examples</a>
354</h4></div></div></div>
355<h6>
356<a name="boost_bimap.the_tutorial.controlling_collection_types.examples.h0"></a>
357 <span class="phrase"><a name="boost_bimap.the_tutorial.controlling_collection_types.examples.countries_populations"></a></span><a class="link" href="controlling_collection_types.html#boost_bimap.the_tutorial.controlling_collection_types.examples.countries_populations">Countries
358 Populations</a>
359 </h6>
360<p>
361 We want to store countries populations. The requirements are:
362 </p>
363<div class="orderedlist"><ol class="orderedlist" type="1">
364<li class="listitem">
365 Get a list of countries in decreasing order of their populations.
366 </li>
367<li class="listitem">
368 Given a country, get their population.
369 </li>
370</ol></div>
371<p>
372 Lets create the appropriate bimap.
373 </p>
374<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special">&lt;</span>
375
376 <span class="identifier">unordered_set_of</span><span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&gt;,</span>
377 <span class="identifier">multiset_of</span><span class="special">&lt;</span> <span class="keyword">long</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">greater</span><span class="special">&lt;</span><span class="keyword">long</span><span class="special">&gt;</span> <span class="special">&gt;</span>
378
379<span class="special">&gt;</span> <span class="identifier">populations_bimap</span><span class="special">;</span>
380</pre>
381<p>
382 First of all countries names are unique identifiers, while two countries
383 may have the same population. This is why we choose <span class="bold"><strong>multi</strong></span><code class="computeroutput"><span class="identifier">set_of</span></code> for populations.
384 </p>
385<p>
386 Using a <code class="computeroutput"><span class="identifier">multiset_of</span></code> for
387 population allow us to iterate over the data. Since listing countries ordered
388 by their names is not a requisite, we can use an <code class="computeroutput"><span class="identifier">unordered_set_of</span></code>
389 that allows constant order look up.
390 </p>
391<p>
392 And now lets use it in a complete example
393 </p>
394<p>
395 <a href="../../../../example/population_bimap.cpp" target="_top">Go to source code</a>
396 </p>
397<p>
398</p>
399<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special">&lt;</span>
400
401 <span class="identifier">unordered_set_of</span><span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&gt;,</span>
402 <span class="identifier">multiset_of</span><span class="special">&lt;</span> <span class="keyword">long</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">greater</span><span class="special">&lt;</span><span class="keyword">long</span><span class="special">&gt;</span> <span class="special">&gt;</span>
403
404<span class="special">&gt;</span> <span class="identifier">population_bimap</span><span class="special">;</span>
405
406<span class="keyword">typedef</span> <span class="identifier">population_bimap</span><span class="special">::</span><span class="identifier">value_type</span> <span class="identifier">population</span><span class="special">;</span>
407
408<span class="identifier">population_bimap</span> <span class="identifier">pop</span><span class="special">;</span>
409<span class="identifier">pop</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">population</span><span class="special">(</span><span class="string">"China"</span><span class="special">,</span> <span class="number">1321000000</span><span class="special">)</span> <span class="special">);</span>
410<span class="identifier">pop</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">population</span><span class="special">(</span><span class="string">"India"</span><span class="special">,</span> <span class="number">1129000000</span><span class="special">)</span> <span class="special">);</span>
411<span class="identifier">pop</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">population</span><span class="special">(</span><span class="string">"United States"</span><span class="special">,</span> <span class="number">301950000</span><span class="special">)</span> <span class="special">);</span>
412<span class="identifier">pop</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">population</span><span class="special">(</span><span class="string">"Indonesia"</span><span class="special">,</span> <span class="number">234950000</span><span class="special">)</span> <span class="special">);</span>
413<span class="identifier">pop</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">population</span><span class="special">(</span><span class="string">"Brazil"</span><span class="special">,</span> <span class="number">186500000</span><span class="special">)</span> <span class="special">);</span>
414<span class="identifier">pop</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">population</span><span class="special">(</span><span class="string">"Pakistan"</span><span class="special">,</span> <span class="number">163630000</span><span class="special">)</span> <span class="special">);</span>
415
416<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Countries by their population:"</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
417
418<span class="comment">// First requirement</span>
419<a class="co" name="boost_bimap.the_tutorial.controlling_collection_types.examples.c0" href="controlling_collection_types.html#boost_bimap.the_tutorial.controlling_collection_types.examples.c1"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a><span class="keyword">for</span><span class="special">(</span> <span class="identifier">population_bimap</span><span class="special">::</span><span class="identifier">right_const_iterator</span>
420 <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">pop</span><span class="special">.</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">iend</span> <span class="special">=</span> <span class="identifier">pop</span><span class="special">.</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
421 <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>
422<span class="special">{</span>
423 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">i</span><span class="special">-&gt;</span><span class="identifier">second</span> <span class="special">&lt;&lt;</span> <span class="string">" with "</span> <span class="special">&lt;&lt;</span> <span class="identifier">i</span><span class="special">-&gt;</span><span class="identifier">first</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
424<span class="special">}</span>
425
426<span class="comment">// Second requirement</span>
427<a class="co" name="boost_bimap.the_tutorial.controlling_collection_types.examples.c2" href="controlling_collection_types.html#boost_bimap.the_tutorial.controlling_collection_types.examples.c3"><img src="../../../../../../doc/src/images/callouts/2.png" alt="2" border="0"></a><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Population of China: "</span> <span class="special">&lt;&lt;</span> <span class="identifier">pop</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="string">"China"</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
428</pre>
429<p>
430 </p>
431<div class="calloutlist"><table border="0" summary="Callout list">
432<tr>
433<td width="5%" valign="top" align="left"><p><a name="boost_bimap.the_tutorial.controlling_collection_types.examples.c1"></a><a href="#boost_bimap.the_tutorial.controlling_collection_types.examples.c0"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a> </p></td>
434<td valign="top" align="left"><p>
435 The right map view works like a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">multimap</span><span class="special">&lt;</span> <span class="keyword">long</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">std</span><span class="special">::</span><span class="identifier">greater</span><span class="special">&lt;</span><span class="keyword">long</span><span class="special">&gt;</span> <span class="special">&gt;</span></code>,
436 We can iterate over it to print the results in the required order.
437 </p></td>
438</tr>
439<tr>
440<td width="5%" valign="top" align="left"><p><a name="boost_bimap.the_tutorial.controlling_collection_types.examples.c3"></a><a href="#boost_bimap.the_tutorial.controlling_collection_types.examples.c2"><img src="../../../../../../doc/src/images/callouts/2.png" alt="2" border="0"></a> </p></td>
441<td valign="top" align="left"><p>
442 The left map view works like a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">unordered_map</span><span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">long</span> <span class="special">&gt;</span></code>, given the name of the country
443 we can use it to search for the population in constant time
444 </p></td>
445</tr>
446</table></div>
447<h6>
448<a name="boost_bimap.the_tutorial.controlling_collection_types.examples.h1"></a>
449 <span class="phrase"><a name="boost_bimap.the_tutorial.controlling_collection_types.examples.repetitions_counter"></a></span><a class="link" href="controlling_collection_types.html#boost_bimap.the_tutorial.controlling_collection_types.examples.repetitions_counter">Repetitions
450 counter</a>
451 </h6>
452<p>
453 We want to count the repetitions for each word in a text and print them
454 in order of appearance.
455 </p>
456<p>
457 <a href="../../../../example/repetitions_counter.cpp" target="_top">Go to source code</a>
458 </p>
459<p>
460</p>
461<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span>
462<span class="special">&lt;</span>
463 <span class="identifier">unordered_set_of</span><span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&gt;,</span>
464 <span class="identifier">list_of</span><span class="special">&lt;</span> <span class="identifier">counter</span> <span class="special">&gt;</span> <a class="co" name="boost_bimap.the_tutorial.controlling_collection_types.examples.c4" href="controlling_collection_types.html#boost_bimap.the_tutorial.controlling_collection_types.examples.c5"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a>
465
466<span class="special">&gt;</span> <span class="identifier">word_counter</span><span class="special">;</span>
467
468<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">tokenizer</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">char_separator</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">text_tokenizer</span><span class="special">;</span>
469
470<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">text</span><span class="special">=</span>
471 <span class="string">"Relations between data in the STL are represented with maps."</span>
472 <span class="string">"A map is a directed relation, by using it you are representing "</span>
473 <span class="string">"a mapping. In this directed relation, the first type is related to "</span>
474 <span class="string">"the second type but it is not true that the inverse relationship "</span>
475 <span class="string">"holds. This is useful in a lot of situations, but there are some "</span>
476 <span class="string">"relationships that are bidirectional by nature."</span><span class="special">;</span>
477
478<span class="comment">// feed the text into the container</span>
479<span class="identifier">word_counter</span> <span class="identifier">wc</span><span class="special">;</span>
480<span class="identifier">text_tokenizer</span> <span class="identifier">tok</span><span class="special">(</span><span class="identifier">text</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">char_separator</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;(</span><span class="string">" \t\n.,;:!?'\"-"</span><span class="special">));</span>
481
482<span class="keyword">for</span><span class="special">(</span> <span class="identifier">text_tokenizer</span><span class="special">::</span><span class="identifier">const_iterator</span> <span class="identifier">it</span> <span class="special">=</span> <span class="identifier">tok</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">it_end</span> <span class="special">=</span> <span class="identifier">tok</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
483 <span class="identifier">it</span> <span class="special">!=</span> <span class="identifier">it_end</span> <span class="special">;</span> <span class="special">++</span><span class="identifier">it</span> <span class="special">)</span>
484<span class="special">{</span>
485 <a class="co" name="boost_bimap.the_tutorial.controlling_collection_types.examples.c6" href="controlling_collection_types.html#boost_bimap.the_tutorial.controlling_collection_types.examples.c7"><img src="../../../../../../doc/src/images/callouts/2.png" alt="2" border="0"></a><span class="special">++</span> <span class="identifier">wc</span><span class="special">.</span><span class="identifier">left</span><span class="special">[*</span><span class="identifier">it</span><span class="special">];</span>
486<span class="special">}</span>
487
488<span class="comment">// list words with counters by order of appearance</span>
489<a class="co" name="boost_bimap.the_tutorial.controlling_collection_types.examples.c8" href="controlling_collection_types.html#boost_bimap.the_tutorial.controlling_collection_types.examples.c9"><img src="../../../../../../doc/src/images/callouts/3.png" alt="3" border="0"></a><span class="keyword">for</span><span class="special">(</span> <span class="identifier">word_counter</span><span class="special">::</span><span class="identifier">right_const_iterator</span>
490 <span class="identifier">wit</span> <span class="special">=</span> <span class="identifier">wc</span><span class="special">.</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">wit_end</span> <span class="special">=</span> <span class="identifier">wc</span><span class="special">.</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
491
492 <span class="identifier">wit</span> <span class="special">!=</span> <span class="identifier">wit_end</span><span class="special">;</span> <span class="special">++</span><span class="identifier">wit</span> <span class="special">)</span>
493<span class="special">{</span>
494 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">wit</span><span class="special">-&gt;</span><span class="identifier">second</span> <span class="special">&lt;&lt;</span> <span class="string">": "</span> <span class="special">&lt;&lt;</span> <span class="identifier">wit</span><span class="special">-&gt;</span><span class="identifier">first</span><span class="special">;</span>
495<span class="special">}</span>
496</pre>
497<p>
498 </p>
499<div class="calloutlist"><table border="0" summary="Callout list">
500<tr>
501<td width="5%" valign="top" align="left"><p><a name="boost_bimap.the_tutorial.controlling_collection_types.examples.c5"></a><a href="#boost_bimap.the_tutorial.controlling_collection_types.examples.c4"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a> </p></td>
502<td valign="top" align="left"><p>
503 <code class="computeroutput"><span class="identifier">counter</span></code> is an integer
504 that is initialized in zero in the constructor
505 </p></td>
506</tr>
507<tr>
508<td width="5%" valign="top" align="left"><p><a name="boost_bimap.the_tutorial.controlling_collection_types.examples.c7"></a><a href="#boost_bimap.the_tutorial.controlling_collection_types.examples.c6"><img src="../../../../../../doc/src/images/callouts/2.png" alt="2" border="0"></a> </p></td>
509<td valign="top" align="left"><p>
510 Because the right collection type is <code class="computeroutput"><span class="identifier">list_of</span></code>,
511 the right data is not used a key and can be modified in the same way
512 as with standard maps.
513 </p></td>
514</tr>
515<tr>
516<td width="5%" valign="top" align="left"><p><a name="boost_bimap.the_tutorial.controlling_collection_types.examples.c9"></a><a href="#boost_bimap.the_tutorial.controlling_collection_types.examples.c8"><img src="../../../../../../doc/src/images/callouts/3.png" alt="3" border="0"></a> </p></td>
517<td valign="top" align="left"><p>
518 When we insert the elements using the left map view, the element is
519 inserted at the end of the list.
520 </p></td>
521</tr>
522</table></div>
523</div>
524</div>
525<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
526<td align="left"></td>
527<td align="right"><div class="copyright-footer">Copyright &#169; 2006-2012 Matias Capeletto<p>
528 Distributed under the Boost Software License, Version 1.0. (See accompanying
529 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>)
530 </p>
531</div></td>
532</tr></table>
533<hr>
534<div class="spirit-nav">
535<a accesskey="p" href="discovering_the_bimap_framework.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../the_tutorial.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="the_collection_of_relations_type.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
536</div>
537</body>
538</html>