controlling_collection_types.html 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  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.79.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">
  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 class="toc">
  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">
  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">
  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">
  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. <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>
  376. <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>
  377. <span class="special">&gt;</span> <span class="identifier">populations_bimap</span><span class="special">;</span>
  378. </pre>
  379. <p>
  380. First of all countries names are unique identifiers, while two countries
  381. 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.
  382. </p>
  383. <p>
  384. Using a <code class="computeroutput"><span class="identifier">multiset_of</span></code> for
  385. population allow us to iterate over the data. Since listing countries ordered
  386. by their names is not a requisite, we can use an <code class="computeroutput"><span class="identifier">unordered_set_of</span></code>
  387. that allows constant order look up.
  388. </p>
  389. <p>
  390. And now lets use it in a complete example
  391. </p>
  392. <p>
  393. <a href="../../../../example/population_bimap.cpp" target="_top">Go to source code</a>
  394. </p>
  395. <p>
  396. </p>
  397. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special">&lt;</span>
  398. <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>
  399. <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>
  400. <span class="special">&gt;</span> <span class="identifier">population_bimap</span><span class="special">;</span>
  401. <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>
  402. <span class="identifier">population_bimap</span> <span class="identifier">pop</span><span class="special">;</span>
  403. <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>
  404. <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>
  405. <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>
  406. <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>
  407. <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>
  408. <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>
  409. <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>
  410. <span class="comment">// First requirement</span>
  411. <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>
  412. <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>
  413. <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>
  414. <span class="special">{</span>
  415. <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>
  416. <span class="special">}</span>
  417. <span class="comment">// Second requirement</span>
  418. <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>
  419. </pre>
  420. <p>
  421. </p>
  422. <div class="calloutlist"><table border="0" summary="Callout list">
  423. <tr>
  424. <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>
  425. <td valign="top" align="left"><p>
  426. 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>,
  427. We can iterate over it to print the results in the required order.
  428. </p></td>
  429. </tr>
  430. <tr>
  431. <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>
  432. <td valign="top" align="left"><p>
  433. 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
  434. we can use it to search for the population in constant time
  435. </p></td>
  436. </tr>
  437. </table></div>
  438. <h6>
  439. <a name="boost_bimap.the_tutorial.controlling_collection_types.examples.h1"></a>
  440. <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
  441. counter</a>
  442. </h6>
  443. <p>
  444. We want to count the repetitions for each word in a text and print them
  445. in order of appearance.
  446. </p>
  447. <p>
  448. <a href="../../../../example/repetitions_counter.cpp" target="_top">Go to source code</a>
  449. </p>
  450. <p>
  451. </p>
  452. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span>
  453. <span class="special">&lt;</span>
  454. <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>
  455. <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>
  456. <span class="special">&gt;</span> <span class="identifier">word_counter</span><span class="special">;</span>
  457. <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>
  458. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">text</span><span class="special">=</span>
  459. <span class="string">"Relations between data in the STL are represented with maps."</span>
  460. <span class="string">"A map is a directed relation, by using it you are representing "</span>
  461. <span class="string">"a mapping. In this directed relation, the first type is related to "</span>
  462. <span class="string">"the second type but it is not true that the inverse relationship "</span>
  463. <span class="string">"holds. This is useful in a lot of situations, but there are some "</span>
  464. <span class="string">"relationships that are bidirectional by nature."</span><span class="special">;</span>
  465. <span class="comment">// feed the text into the container</span>
  466. <span class="identifier">word_counter</span> <span class="identifier">wc</span><span class="special">;</span>
  467. <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>
  468. <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>
  469. <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>
  470. <span class="special">{</span>
  471. <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>
  472. <span class="special">}</span>
  473. <span class="comment">// list words with counters by order of appearance</span>
  474. <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>
  475. <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>
  476. <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>
  477. <span class="special">{</span>
  478. <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>
  479. <span class="special">}</span>
  480. </pre>
  481. <p>
  482. </p>
  483. <div class="calloutlist"><table border="0" summary="Callout list">
  484. <tr>
  485. <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>
  486. <td valign="top" align="left"><p>
  487. <code class="computeroutput"><span class="identifier">counter</span></code> is an integer
  488. that is initialized in zero in the constructor
  489. </p></td>
  490. </tr>
  491. <tr>
  492. <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>
  493. <td valign="top" align="left"><p>
  494. Because the right collection type is <code class="computeroutput"><span class="identifier">list_of</span></code>,
  495. the right data is not used a key and can be modified in the same way
  496. as with standard maps.
  497. </p></td>
  498. </tr>
  499. <tr>
  500. <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>
  501. <td valign="top" align="left"><p>
  502. When we insert the elements using the left map view, the element is
  503. inserted at the end of the list.
  504. </p></td>
  505. </tr>
  506. </table></div>
  507. </div>
  508. </div>
  509. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  510. <td align="left"></td>
  511. <td align="right"><div class="copyright-footer">Copyright &#169; 2006-2012 Matias Capeletto<p>
  512. Distributed under the Boost Software License, Version 1.0. (See accompanying
  513. 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>)
  514. </p>
  515. </div></td>
  516. </tr></table>
  517. <hr>
  518. <div class="spirit-nav">
  519. <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>
  520. </div>
  521. </body>
  522. </html>