the_collection_of_relations_type.html 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>The collection of relations type</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="controlling_collection_types.html" title="Controlling collection types">
  10. <link rel="next" href="differences_with_standard_maps.html" title="Differences with standard maps">
  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="controlling_collection_types.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="differences_with_standard_maps.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.the_collection_of_relations_type"></a><a class="link" href="the_collection_of_relations_type.html" title="The collection of relations type">The
  28. collection of relations type</a>
  29. </h3></div></div></div>
  30. <div class="toc"><dl class="toc">
  31. <dt><span class="section"><a href="the_collection_of_relations_type.html#boost_bimap.the_tutorial.the_collection_of_relations_type.a_new_point_of_view">A
  32. new point of view</a></span></dt>
  33. <dt><span class="section"><a href="the_collection_of_relations_type.html#boost_bimap.the_tutorial.the_collection_of_relations_type.configuration_parameters">Configuration
  34. parameters</a></span></dt>
  35. <dt><span class="section"><a href="the_collection_of_relations_type.html#boost_bimap.the_tutorial.the_collection_of_relations_type.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.the_collection_of_relations_type.a_new_point_of_view"></a><a class="link" href="the_collection_of_relations_type.html#boost_bimap.the_tutorial.the_collection_of_relations_type.a_new_point_of_view" title="A new point of view">A
  40. new point of view</a>
  41. </h4></div></div></div>
  42. <p>
  43. Being able to change the collection type of the bimap relation view is
  44. another very important feature. Remember that this view allows the user
  45. to see the container as a group of the stored relations. This view has
  46. set semantics instead of map semantics.
  47. </p>
  48. <p>
  49. <span class="inlinemediaobject"><img src="../../images/bimap/collection.type.of.relation.png" alt="collection.type.of.relation"></span>
  50. </p>
  51. <p>
  52. By default, Boost.Bimap will base the collection type of the relation on
  53. the type of the left collection. If the left collection type is a set,
  54. then the collection type of the relation will be a set with the same order
  55. as the left view.
  56. </p>
  57. <p>
  58. In general, Boost.Bimap users will base the collection type of a relation
  59. on the type of the collection on one of the two sides. However there are
  60. times where it is useful to give this collection other constraints or simply
  61. to order it differently. The user is allowed to choose between:
  62. </p>
  63. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  64. <li class="listitem">
  65. left_based
  66. </li>
  67. <li class="listitem">
  68. right_based
  69. </li>
  70. <li class="listitem">
  71. set_of_relation&lt;&gt;
  72. </li>
  73. <li class="listitem">
  74. multiset_of_relation&lt;&gt;
  75. </li>
  76. <li class="listitem">
  77. unordered_set_of_relation&lt;&gt;
  78. </li>
  79. <li class="listitem">
  80. unordered_multiset_of_relation&lt;&gt;
  81. </li>
  82. <li class="listitem">
  83. list_of_relation
  84. </li>
  85. <li class="listitem">
  86. vector_of_relation
  87. </li>
  88. <li class="listitem">
  89. unconstrained_set_of_relation
  90. </li>
  91. </ul></div>
  92. <div class="tip"><table border="0" summary="Tip">
  93. <tr>
  94. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../../../../doc/src/images/tip.png"></td>
  95. <th align="left">Tip</th>
  96. </tr>
  97. <tr><td align="left" valign="top"><p>
  98. The first two options and the last produce faster bimaps, so prefer these
  99. where possible.
  100. </p></td></tr>
  101. </table></div>
  102. <p>
  103. <span class="inlinemediaobject"><img src="../../images/bimap/more.bimap.structures.png" alt="more.bimap.structures"></span>
  104. </p>
  105. <p>
  106. The collection type of relation can be used to create powerful containers.
  107. For example, if you need to maximize search speed, then the best bidirectional
  108. map possible is one that relates elements from an <code class="computeroutput"><span class="identifier">unordered_set</span></code>
  109. to another <code class="computeroutput"><span class="identifier">unordered_set</span></code>.
  110. The problem is that this container cannot be iterated. If you need to know
  111. the list of relations inside the container, you need another collection
  112. type of relation. In this case, a <code class="computeroutput"><span class="identifier">list_of_relation</span></code>
  113. is a good choice. The resulting container trades insertion and deletion
  114. time against fast search capabilities and the possibility of bidirectional
  115. iteration.
  116. </p>
  117. <p>
  118. <a href="../../../../example/mighty_bimap.cpp" target="_top">Go to source code</a>
  119. </p>
  120. <p>
  121. </p>
  122. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
  123. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span>
  124. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bimap</span><span class="special">/</span><span class="identifier">bimap</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  125. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bimap</span><span class="special">/</span><span class="identifier">list_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  126. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bimap</span><span class="special">/</span><span class="identifier">unordered_set_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  127. <span class="keyword">struct</span> <span class="identifier">english</span> <span class="special">{};</span>
  128. <span class="keyword">struct</span> <span class="identifier">spanish</span> <span class="special">{};</span>
  129. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
  130. <span class="special">{</span>
  131. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bimaps</span><span class="special">;</span>
  132. <span class="keyword">typedef</span> <span class="identifier">bimap</span>
  133. <span class="special">&lt;</span>
  134. <span class="identifier">unordered_set_of</span><span class="special">&lt;</span> <span class="identifier">tagged</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="identifier">spanish</span> <span class="special">&gt;</span> <span class="special">&gt;,</span>
  135. <span class="identifier">unordered_set_of</span><span class="special">&lt;</span> <span class="identifier">tagged</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="identifier">english</span> <span class="special">&gt;</span> <span class="special">&gt;,</span>
  136. <span class="identifier">list_of_relation</span>
  137. <span class="special">&gt;</span> <span class="identifier">translator</span><span class="special">;</span>
  138. <span class="identifier">translator</span> <span class="identifier">trans</span><span class="special">;</span>
  139. <span class="comment">// We have to use `push_back` because the collection of relations is</span>
  140. <span class="comment">// a `list_of_relation`</span>
  141. <span class="identifier">trans</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span> <span class="identifier">translator</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="string">"hola"</span> <span class="special">,</span><span class="string">"hello"</span> <span class="special">)</span> <span class="special">);</span>
  142. <span class="identifier">trans</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span> <span class="identifier">translator</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="string">"adios"</span> <span class="special">,</span><span class="string">"goodbye"</span> <span class="special">)</span> <span class="special">);</span>
  143. <span class="identifier">trans</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span> <span class="identifier">translator</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="string">"rosa"</span> <span class="special">,</span><span class="string">"rose"</span> <span class="special">)</span> <span class="special">);</span>
  144. <span class="identifier">trans</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span> <span class="identifier">translator</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">(</span><span class="string">"mesa"</span> <span class="special">,</span><span class="string">"table"</span> <span class="special">)</span> <span class="special">);</span>
  145. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"enter a word"</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>
  146. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">word</span><span class="special">;</span>
  147. <span class="identifier">std</span><span class="special">::</span><span class="identifier">getline</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cin</span><span class="special">,</span><span class="identifier">word</span><span class="special">);</span>
  148. <span class="comment">// Search the queried word on the from index (Spanish)</span>
  149. <span class="identifier">translator</span><span class="special">::</span><span class="identifier">map_by</span><span class="special">&lt;</span><span class="identifier">spanish</span><span class="special">&gt;::</span><span class="identifier">const_iterator</span> <span class="identifier">is</span>
  150. <span class="special">=</span> <span class="identifier">trans</span><span class="special">.</span><span class="identifier">by</span><span class="special">&lt;</span><span class="identifier">spanish</span><span class="special">&gt;().</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">word</span><span class="special">);</span>
  151. <span class="keyword">if</span><span class="special">(</span> <span class="identifier">is</span> <span class="special">!=</span> <span class="identifier">trans</span><span class="special">.</span><span class="identifier">by</span><span class="special">&lt;</span><span class="identifier">spanish</span><span class="special">&gt;().</span><span class="identifier">end</span><span class="special">()</span> <span class="special">)</span>
  152. <span class="special">{</span>
  153. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">word</span> <span class="special">&lt;&lt;</span> <span class="string">" is said "</span>
  154. <span class="special">&lt;&lt;</span> <span class="identifier">is</span><span class="special">-&gt;</span><span class="identifier">get</span><span class="special">&lt;</span><span class="identifier">english</span><span class="special">&gt;()</span>
  155. <span class="special">&lt;&lt;</span> <span class="string">" in English"</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>
  156. <span class="special">}</span>
  157. <span class="keyword">else</span>
  158. <span class="special">{</span>
  159. <span class="comment">// Word not found in Spanish, try our luck in English</span>
  160. <span class="identifier">translator</span><span class="special">::</span><span class="identifier">map_by</span><span class="special">&lt;</span><span class="identifier">english</span><span class="special">&gt;::</span><span class="identifier">const_iterator</span> <span class="identifier">ie</span>
  161. <span class="special">=</span> <span class="identifier">trans</span><span class="special">.</span><span class="identifier">by</span><span class="special">&lt;</span><span class="identifier">english</span><span class="special">&gt;().</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">word</span><span class="special">);</span>
  162. <span class="keyword">if</span><span class="special">(</span> <span class="identifier">ie</span> <span class="special">!=</span> <span class="identifier">trans</span><span class="special">.</span><span class="identifier">by</span><span class="special">&lt;</span><span class="identifier">english</span><span class="special">&gt;().</span><span class="identifier">end</span><span class="special">()</span> <span class="special">)</span>
  163. <span class="special">{</span>
  164. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">word</span> <span class="special">&lt;&lt;</span> <span class="string">" is said "</span>
  165. <span class="special">&lt;&lt;</span> <span class="identifier">ie</span><span class="special">-&gt;</span><span class="identifier">get</span><span class="special">&lt;</span><span class="identifier">spanish</span><span class="special">&gt;()</span>
  166. <span class="special">&lt;&lt;</span> <span class="string">" in Spanish"</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>
  167. <span class="special">}</span>
  168. <span class="keyword">else</span>
  169. <span class="special">{</span>
  170. <span class="comment">// Word not found, show the possible translations</span>
  171. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"No such word in the dictionary"</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>
  172. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"These are the possible translations"</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>
  173. <span class="keyword">for</span><span class="special">(</span> <span class="identifier">translator</span><span class="special">::</span><span class="identifier">const_iterator</span>
  174. <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">trans</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span>
  175. <span class="identifier">i_end</span> <span class="special">=</span> <span class="identifier">trans</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
  176. <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">i_end</span> <span class="special">;</span> <span class="special">++</span><span class="identifier">i</span> <span class="special">)</span>
  177. <span class="special">{</span>
  178. <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">get</span><span class="special">&lt;</span><span class="identifier">spanish</span><span class="special">&gt;()</span>
  179. <span class="special">&lt;&lt;</span> <span class="string">" &lt;---&gt; "</span>
  180. <span class="special">&lt;&lt;</span> <span class="identifier">i</span><span class="special">-&gt;</span><span class="identifier">get</span><span class="special">&lt;</span><span class="identifier">english</span><span class="special">&gt;()</span>
  181. <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
  182. <span class="special">}</span>
  183. <span class="special">}</span>
  184. <span class="special">}</span>
  185. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  186. <span class="special">}</span>
  187. </pre>
  188. <p>
  189. </p>
  190. </div>
  191. <div class="section">
  192. <div class="titlepage"><div><div><h4 class="title">
  193. <a name="boost_bimap.the_tutorial.the_collection_of_relations_type.configuration_parameters"></a><a class="link" href="the_collection_of_relations_type.html#boost_bimap.the_tutorial.the_collection_of_relations_type.configuration_parameters" title="Configuration parameters">Configuration
  194. parameters</a>
  195. </h4></div></div></div>
  196. <p>
  197. Each collection type of relation has different parameters to control its
  198. behaviour. For example, in the <code class="computeroutput"><span class="identifier">set_of_relation</span></code>
  199. specification, you can pass a Functor type that compares two types. All
  200. of the parameters are exactly as in the standard library containers, except
  201. for the type, which is set to the bimap relation and the allocator type.
  202. To help users in the creation of each functor, the collection type of relation
  203. templates takes an mpl lambda expression where the relation type will be
  204. evaluated later. A placeholder named <code class="computeroutput"><span class="identifier">_relation</span></code>
  205. is available to bimap users.
  206. </p>
  207. <p>
  208. The following table lists the meaning of the parameters for each collection
  209. type of relations.
  210. </p>
  211. <div class="informaltable"><table class="table">
  212. <colgroup>
  213. <col>
  214. <col>
  215. </colgroup>
  216. <thead><tr>
  217. <th>
  218. <p>
  219. name
  220. </p>
  221. </th>
  222. <th>
  223. <p>
  224. Additional Parameters
  225. </p>
  226. </th>
  227. </tr></thead>
  228. <tbody>
  229. <tr>
  230. <td>
  231. <p>
  232. <code class="computeroutput"><span class="identifier">left_based</span></code>
  233. </p>
  234. </td>
  235. <td>
  236. <p>
  237. Not a template.
  238. </p>
  239. </td>
  240. </tr>
  241. <tr>
  242. <td>
  243. <p>
  244. <code class="computeroutput"><span class="identifier">right_based</span></code>
  245. </p>
  246. </td>
  247. <td>
  248. <p>
  249. Not a template.
  250. </p>
  251. </td>
  252. </tr>
  253. <tr>
  254. <td>
  255. <p>
  256. <code class="computeroutput"><span class="identifier">set_of_relation</span><span class="special">&lt;</span><span class="identifier">KeyComp</span><span class="special">&gt;</span></code>
  257. </p>
  258. <p>
  259. <code class="computeroutput"><span class="identifier">multiset_of_relation</span><span class="special">&lt;</span><span class="identifier">KeyComp</span><span class="special">&gt;</span></code>
  260. </p>
  261. </td>
  262. <td>
  263. <p>
  264. <span class="bold"><strong>KeyComp </strong></span> is a Functor that compares
  265. two types using less than. By default, the less-than operator
  266. 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">_relation</span><span class="special">&gt;</span></code>.
  267. </p>
  268. </td>
  269. </tr>
  270. <tr>
  271. <td>
  272. <p>
  273. <code class="computeroutput"><span class="identifier">unordered_set_of_relation</span><span class="special">&lt;</span><span class="identifier">HashFunctor</span><span class="special">,</span><span class="identifier">EqualKey</span><span class="special">&gt;</span></code>
  274. </p>
  275. <p>
  276. <code class="computeroutput"><span class="identifier">unordered_multiset_of_relation</span><span class="special">&lt;</span><span class="identifier">HashFunctor</span><span class="special">,</span><span class="identifier">EqualKey</span><span class="special">&gt;</span></code>
  277. </p>
  278. </td>
  279. <td>
  280. <p>
  281. <span class="bold"><strong>HashFunctor </strong></span> converts the <code class="computeroutput"><span class="identifier">relation</span></code> 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
  282. 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">_relation</span><span class="special">&gt;</span></code>.
  283. </p>
  284. <p>
  285. <span class="bold"><strong>EqualKey </strong></span> is a Functor that
  286. tests two relations for equality. By default, the equality operator
  287. 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">_relation</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">list_of_relation</span></code>
  295. </p>
  296. </td>
  297. <td>
  298. <p>
  299. Not a template.
  300. </p>
  301. </td>
  302. </tr>
  303. <tr>
  304. <td>
  305. <p>
  306. <code class="computeroutput"><span class="identifier">vector_of_relation</span></code>
  307. </p>
  308. </td>
  309. <td>
  310. <p>
  311. Not a template.
  312. </p>
  313. </td>
  314. </tr>
  315. <tr>
  316. <td>
  317. <p>
  318. <code class="computeroutput"><span class="identifier">unconstrained_set_of_relation</span></code>
  319. </p>
  320. </td>
  321. <td>
  322. <p>
  323. Not a template.
  324. </p>
  325. </td>
  326. </tr>
  327. </tbody>
  328. </table></div>
  329. </div>
  330. <div class="section">
  331. <div class="titlepage"><div><div><h4 class="title">
  332. <a name="boost_bimap.the_tutorial.the_collection_of_relations_type.examples"></a><a class="link" href="the_collection_of_relations_type.html#boost_bimap.the_tutorial.the_collection_of_relations_type.examples" title="Examples">Examples</a>
  333. </h4></div></div></div>
  334. <p>
  335. Consider this example:
  336. </p>
  337. <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">Rel</span> <span class="special">&gt;</span>
  338. <span class="keyword">struct</span> <span class="identifier">RelOrder</span>
  339. <span class="special">{</span>
  340. <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Rel</span> <span class="identifier">ra</span><span class="special">,</span> <span class="identifier">Rel</span> <span class="identifier">rb</span><span class="special">)</span> <span class="keyword">const</span>
  341. <span class="special">{</span>
  342. <span class="keyword">return</span> <span class="special">(</span><span class="identifier">ra</span><span class="special">.</span><span class="identifier">left</span><span class="special">+</span><span class="identifier">ra</span><span class="special">.</span><span class="identifier">right</span><span class="special">)</span> <span class="special">&lt;</span> <span class="special">(</span><span class="identifier">rb</span><span class="special">.</span><span class="identifier">left</span><span class="special">+</span><span class="identifier">rb</span><span class="special">.</span><span class="identifier">right</span><span class="special">);</span>
  343. <span class="special">}</span>
  344. <span class="special">};</span>
  345. <span class="keyword">typedef</span> <span class="identifier">bimap</span>
  346. <span class="special">&lt;</span>
  347. <span class="identifier">multiset_of</span><span class="special">&lt;</span> <span class="keyword">int</span> <span class="special">&gt;,</span>
  348. <span class="identifier">multiset_of</span><span class="special">&lt;</span> <span class="keyword">int</span> <span class="special">&gt;,</span>
  349. <span class="identifier">set_of_relation</span><span class="special">&lt;</span> <span class="identifier">RelOrder</span><span class="special">&lt;</span><span class="identifier">_relation</span><span class="special">&gt;</span> <span class="special">&gt;</span>
  350. <span class="special">&gt;</span> <span class="identifier">bimap_type</span><span class="special">;</span>
  351. </pre>
  352. <p>
  353. Here the bimap relation view is ordered using the information of both sides.
  354. This container will only allow unique relations because <code class="computeroutput"><span class="identifier">set_of_relation</span></code>
  355. has been used but the elements in each side of the bimap can be repeated.
  356. </p>
  357. <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">name</span> <span class="special">{};</span>
  358. <span class="keyword">struct</span> <span class="identifier">phone_number</span> <span class="special">{};</span>
  359. <span class="keyword">typedef</span> <span class="identifier">bimap</span>
  360. <span class="special">&lt;</span>
  361. <span class="identifier">tagged</span><span class="special">&lt;</span> <span class="identifier">unordered_multiset_of</span><span class="special">&lt;</span> <span class="identifier">string</span> <span class="special">&gt;,</span> <span class="identifier">name</span> <span class="special">&gt;,</span>
  362. <span class="identifier">tagged</span><span class="special">&lt;</span> <span class="identifier">unordered_set_of</span> <span class="special">&lt;</span> <span class="keyword">int</span> <span class="special">&gt;,</span> <span class="identifier">phone_number</span> <span class="special">&gt;,</span>
  363. <span class="identifier">set_of_relation</span><span class="special">&lt;&gt;</span>
  364. <span class="special">&gt;</span> <span class="identifier">bimap_type</span><span class="special">;</span>
  365. </pre>
  366. <p>
  367. In this other case the bimap will relate names to phone numbers. Names
  368. can be repeated and phone numbers are unique. You can perform quick searches
  369. by name or phone number and the container can be viewed ordered using the
  370. relation view.
  371. </p>
  372. </div>
  373. </div>
  374. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  375. <td align="left"></td>
  376. <td align="right"><div class="copyright-footer">Copyright &#169; 2006-2012 Matias Capeletto<p>
  377. Distributed under the Boost Software License, Version 1.0. (See accompanying
  378. 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>)
  379. </p>
  380. </div></td>
  381. </tr></table>
  382. <hr>
  383. <div class="spirit-nav">
  384. <a accesskey="p" href="controlling_collection_types.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="differences_with_standard_maps.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  385. </div>
  386. </body>
  387. </html>