additional_information.html 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Additional information</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="unconstrained_sets.html" title="Unconstrained Sets">
  10. <link rel="next" href="complete_instantiation_scheme.html" title="Complete instantiation scheme">
  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="unconstrained_sets.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="complete_instantiation_scheme.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.additional_information"></a><a class="link" href="additional_information.html" title="Additional information">Additional
  28. information</a>
  29. </h3></div></div></div>
  30. <p>
  31. Bidirectional maps may have associated information about each relation. Suppose
  32. we want to represent a books and author bidirectional map.
  33. </p>
  34. <p>
  35. </p>
  36. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special">&lt;</span>
  37. <span class="identifier">multiset_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> <span class="comment">// author</span>
  38. <span class="identifier">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> <span class="comment">// title</span>
  39. <span class="special">&gt;</span> <span class="identifier">bm_type</span><span class="special">;</span>
  40. <span class="keyword">typedef</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span> <span class="identifier">book</span><span class="special">;</span>
  41. <span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span>
  42. <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">book</span><span class="special">(</span> <span class="string">"Bjarne Stroustrup"</span> <span class="special">,</span> <span class="string">"The C++ Programming Language"</span> <span class="special">)</span> <span class="special">);</span>
  43. <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">book</span><span class="special">(</span> <span class="string">"Scott Meyers"</span> <span class="special">,</span> <span class="string">"Effective C++"</span> <span class="special">)</span> <span class="special">);</span>
  44. <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">book</span><span class="special">(</span> <span class="string">"Andrei Alexandrescu"</span> <span class="special">,</span> <span class="string">"Modern C++ Design"</span> <span class="special">)</span> <span class="special">);</span>
  45. <span class="comment">// Print the author of Modern C++</span>
  46. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span> <span class="string">"Modern C++ Design"</span> <span class="special">);</span>
  47. </pre>
  48. <p>
  49. </p>
  50. <p>
  51. Suppose now that we want to store abstract of each book. We have two options:
  52. </p>
  53. <div class="orderedlist"><ol class="orderedlist" type="1">
  54. <li class="listitem">
  55. Books name are unique identifiers, so we can create a separate <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span> <span class="identifier">string</span><span class="special">,</span> <span class="identifier">string</span> <span class="special">&gt;</span></code>
  56. that relates books names with abstracts.
  57. </li>
  58. <li class="listitem">
  59. We can use <a href="http://www.boost.org/libs/multi_index/doc/index.html" target="_top"><span class="bold"><strong>Boost.MultiIndex</strong></span></a> for the new beast.
  60. </li>
  61. </ol></div>
  62. <p>
  63. Option 1 is the wrong approach, if we go this path we lost what bimap has
  64. won us. We now have to maintain the logic of two interdependent containers,
  65. there is an extra string stored for each book name, and the performance will
  66. be worse. This is far away from being a good solution.
  67. </p>
  68. <p>
  69. Option 2 is correct. We start thinking books as entries in a table. So it
  70. makes sense to start using Boost.MultiIndex. We can then add the year of
  71. publication, the price, etc... and we can index this new items too. So Boost.MultiIndex
  72. is a sound solution for our problem.
  73. </p>
  74. <p>
  75. The thing is that there are cases where we want to maintain bimap semantics
  76. (use <code class="computeroutput"><span class="identifier">at</span><span class="special">()</span></code>
  77. to find an author given a book name and the other way around) and add information
  78. about the relations that we are sure we will not want to index later (like
  79. the abstracts). Option 1 is not possible, option 2 neither.
  80. </p>
  81. <p>
  82. Boost.Bimap provides support for this kind of situations by means of an embedded
  83. information member. You can pass an extra parameter to a bimap: <code class="computeroutput"><span class="identifier">with_info</span><span class="special">&lt;</span>
  84. <span class="identifier">InfoType</span> <span class="special">&gt;</span></code>
  85. and an <code class="computeroutput"><span class="identifier">info</span></code> member of type
  86. <code class="computeroutput"><span class="identifier">InfoType</span></code> will appear in the
  87. relation and bimap pairs.
  88. </p>
  89. <p>
  90. <span class="inlinemediaobject"><img src="../../images/bimap/relation.and.pair.with.info.png" alt="relation.and.pair.with.info"></span>
  91. </p>
  92. <p>
  93. Relations and bimap pairs constructors will take an extra argument. If only
  94. two arguments are used, the information will be initialized with their default
  95. constructor.
  96. </p>
  97. <p>
  98. </p>
  99. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special">&lt;</span>
  100. <span class="identifier">multiset_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> <span class="comment">// author</span>
  101. <span class="identifier">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> <span class="comment">// title</span>
  102. <span class="identifier">with_info</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> <span class="comment">// abstract</span>
  103. <span class="special">&gt;</span> <span class="identifier">bm_type</span><span class="special">;</span>
  104. <span class="keyword">typedef</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span> <span class="identifier">book</span><span class="special">;</span>
  105. <span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span>
  106. <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span>
  107. <span class="identifier">book</span><span class="special">(</span> <span class="string">"Bjarne Stroustrup"</span> <span class="special">,</span> <span class="string">"The C++ Programming Language"</span><span class="special">,</span>
  108. <span class="string">"For C++ old-timers, the first edition of this book is"</span>
  109. <span class="string">"the one that started it all&#8212;the font of our knowledge."</span> <span class="special">)</span>
  110. <span class="special">);</span>
  111. <span class="comment">// Print the author of the bible</span>
  112. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="string">"The C++ Programming Language"</span><span class="special">);</span>
  113. <span class="comment">// Print the abstract of this book</span>
  114. <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">left_iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="string">"Bjarne Stroustrup"</span><span class="special">);</span>
  115. <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">info</span><span class="special">;</span>
  116. </pre>
  117. <p>
  118. </p>
  119. <p>
  120. Contrary to the two key types, the information will be mutable using iterators.
  121. </p>
  122. <p>
  123. </p>
  124. <pre class="programlisting"><span class="identifier">i</span><span class="special">-&gt;</span><span class="identifier">info</span> <span class="special">+=</span> <span class="string">"More details about this book"</span><span class="special">;</span>
  125. </pre>
  126. <p>
  127. </p>
  128. <p>
  129. A new function is included in <span class="emphasis"><em>unique</em></span> map views: <code class="computeroutput"><span class="identifier">info_at</span><span class="special">(</span><span class="identifier">key</span><span class="special">)</span></code>, that
  130. mimics the standard <code class="computeroutput"><span class="identifier">at</span><span class="special">(</span><span class="identifier">key</span><span class="special">)</span></code> function
  131. but returned the associated information instead of the data.
  132. </p>
  133. <p>
  134. </p>
  135. <pre class="programlisting"><span class="comment">// Print the new abstract</span>
  136. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">info_at</span><span class="special">(</span><span class="string">"The C++ Programming Language"</span><span class="special">);</span>
  137. </pre>
  138. <p>
  139. </p>
  140. <p>
  141. The info member can be tagged just as the left or the right member. The following
  142. is a rewrite of the above example using user defined names:
  143. </p>
  144. <p>
  145. </p>
  146. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special">&lt;</span>
  147. <span class="identifier">multiset_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">author</span> <span class="special">&gt;</span> <span class="special">&gt;,</span>
  148. <span class="identifier">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">title</span> <span class="special">&gt;</span> <span class="special">&gt;,</span>
  149. <span class="identifier">with_info</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">abstract</span> <span class="special">&gt;</span> <span class="special">&gt;</span>
  150. <span class="special">&gt;</span> <span class="identifier">bm_type</span><span class="special">;</span>
  151. <span class="keyword">typedef</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">value_type</span> <span class="identifier">book</span><span class="special">;</span>
  152. <span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span>
  153. <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span>
  154. <span class="identifier">book</span><span class="special">(</span> <span class="string">"Bjarne Stroustrup"</span> <span class="special">,</span> <span class="string">"The C++ Programming Language"</span><span class="special">,</span>
  155. <span class="string">"For C++ old-timers, the first edition of this book is"</span>
  156. <span class="string">"the one that started it all&#8212;the font of our knowledge."</span> <span class="special">)</span>
  157. <span class="special">);</span>
  158. <span class="comment">// Print the author of the bible</span>
  159. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">by</span><span class="special">&lt;</span><span class="identifier">title</span><span class="special">&gt;().</span><span class="identifier">at</span><span class="special">(</span><span class="string">"The C++ Programming Language"</span><span class="special">);</span>
  160. <span class="comment">// Print the abstract of this book</span>
  161. <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">map_by</span><span class="special">&lt;</span><span class="identifier">author</span><span class="special">&gt;::</span><span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">by</span><span class="special">&lt;</span><span class="identifier">author</span><span class="special">&gt;().</span><span class="identifier">find</span><span class="special">(</span><span class="string">"Bjarne Stroustrup"</span><span class="special">);</span>
  162. <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">abstract</span><span class="special">&gt;();</span>
  163. <span class="comment">// Contrary to the two key types, the information will be mutable</span>
  164. <span class="comment">// using iterators.</span>
  165. <span class="identifier">i</span><span class="special">-&gt;</span><span class="identifier">get</span><span class="special">&lt;</span><span class="identifier">abstract</span><span class="special">&gt;()</span> <span class="special">+=</span> <span class="string">"More details about this book"</span><span class="special">;</span>
  166. <span class="comment">// Print the new abstract</span>
  167. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">by</span><span class="special">&lt;</span><span class="identifier">title</span><span class="special">&gt;().</span><span class="identifier">info_at</span><span class="special">(</span><span class="string">"The C++ Programming Language"</span><span class="special">);</span>
  168. </pre>
  169. <p>
  170. </p>
  171. <p>
  172. <a href="../../../../example/tutorial_info_hook.cpp" target="_top">Go to source code</a>
  173. </p>
  174. </div>
  175. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  176. <td align="left"></td>
  177. <td align="right"><div class="copyright-footer">Copyright &#169; 2006-2012 Matias Capeletto<p>
  178. Distributed under the Boost Software License, Version 1.0. (See accompanying
  179. 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>)
  180. </p>
  181. </div></td>
  182. </tr></table>
  183. <hr>
  184. <div class="spirit-nav">
  185. <a accesskey="p" href="unconstrained_sets.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="complete_instantiation_scheme.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  186. </div>
  187. </body>
  188. </html>