unconstrained_sets.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Unconstrained Sets</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="bimaps_with_user_defined_names.html" title="Bimaps with user defined names">
  10. <link rel="next" href="additional_information.html" title="Additional information">
  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="bimaps_with_user_defined_names.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="additional_information.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.unconstrained_sets"></a><a class="link" href="unconstrained_sets.html" title="Unconstrained Sets">Unconstrained
  28. Sets</a>
  29. </h3></div></div></div>
  30. <p>
  31. Unconstrained sets allow the user to disable one of the views of a bimap.
  32. Doing so makes the bimap operations execute faster and reduces memory consumption.
  33. This completes the bidirectional mapping framework by including unidirectional
  34. mappings as a particular case.
  35. </p>
  36. <p>
  37. Unconstrained sets are useful for the following reasons:
  38. </p>
  39. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  40. <li class="listitem">
  41. A bimap type has stronger guarantees than its standard equivalent, and
  42. includes some useful functions (replace, modify) that the standard does
  43. not have.
  44. </li>
  45. <li class="listitem">
  46. You can view the mapping as a collection of relations.
  47. </li>
  48. <li class="listitem">
  49. Using this kind of map makes the code very extensible. If, at any moment
  50. of the development, the need to perform searches from the right side
  51. of the mapping arises, the only necessary change is to the <code class="computeroutput"><span class="keyword">typedef</span></code>.
  52. </li>
  53. </ul></div>
  54. <p>
  55. Given this bimap instance,
  56. </p>
  57. <p>
  58. </p>
  59. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</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">unconstrained_set_of</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">bm_type</span><span class="special">;</span>
  60. <span class="keyword">typedef</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">left_map</span> <span class="identifier">map_type</span><span class="special">;</span>
  61. <span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span>
  62. <span class="identifier">map_type</span> <span class="special">&amp;</span> <span class="identifier">m</span> <span class="special">=</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span><span class="special">;</span>
  63. </pre>
  64. <p>
  65. </p>
  66. <p>
  67. or this standard map one
  68. </p>
  69. <p>
  70. </p>
  71. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">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">int</span> <span class="special">&gt;</span> <span class="identifier">map_type</span><span class="special">;</span>
  72. <span class="identifier">map_type</span> <span class="identifier">m</span><span class="special">;</span>
  73. </pre>
  74. <p>
  75. </p>
  76. <p>
  77. The following code snippet is valid
  78. </p>
  79. <p>
  80. </p>
  81. <pre class="programlisting"><span class="identifier">m</span><span class="special">[</span><span class="string">"one"</span><span class="special">]</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
  82. <span class="identifier">assert</span><span class="special">(</span> <span class="identifier">m</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="string">"one"</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">m</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span> <span class="special">);</span>
  83. <span class="keyword">for</span><span class="special">(</span> <span class="identifier">map_type</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">m</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">m</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">iend</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span> <span class="special">)</span>
  84. <span class="special">{</span>
  85. <a class="co" name="boost_bimap.the_tutorial.unconstrained_sets.c0" href="unconstrained_sets.html#boost_bimap.the_tutorial.unconstrained_sets.c1"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a><span class="special">++(</span><span class="identifier">i</span><span class="special">-&gt;</span><span class="identifier">second</span><span class="special">);</span>
  86. <span class="special">}</span>
  87. <span class="identifier">m</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="string">"one"</span><span class="special">);</span>
  88. </pre>
  89. <p>
  90. </p>
  91. <div class="calloutlist"><table border="0" summary="Callout list"><tr>
  92. <td width="5%" valign="top" align="left"><p><a name="boost_bimap.the_tutorial.unconstrained_sets.c1"></a><a href="#boost_bimap.the_tutorial.unconstrained_sets.c0"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a> </p></td>
  93. <td valign="top" align="left"><p>
  94. The right collection of the bimap is mutable so its elements can be modified
  95. using iterators.
  96. </p></td>
  97. </tr></table></div>
  98. <p>
  99. But using a bimap has some benefits
  100. </p>
  101. <p>
  102. </p>
  103. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">map_type</span><span class="special">::</span><span class="identifier">const_iterator</span> <span class="identifier">const_iterator</span><span class="special">;</span>
  104. <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">const_iterator</span><span class="special">,</span><span class="identifier">const_iterator</span><span class="special">&gt;</span> <span class="identifier">const_range</span><span class="special">;</span>
  105. <a class="co" name="boost_bimap.the_tutorial.unconstrained_sets.c2" href="unconstrained_sets.html#boost_bimap.the_tutorial.unconstrained_sets.c3"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a><span class="identifier">const_range</span> <span class="identifier">r</span> <span class="special">=</span> <span class="identifier">m</span><span class="special">.</span><span class="identifier">range</span><span class="special">(</span> <span class="string">"one"</span> <span class="special">&lt;=</span> <span class="identifier">_key</span><span class="special">,</span> <span class="identifier">_key</span> <span class="special">&lt;=</span> <span class="string">"two"</span> <span class="special">);</span>
  106. <span class="keyword">for</span><span class="special">(</span> <span class="identifier">const_iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">r</span><span class="special">.</span><span class="identifier">first</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">r</span><span class="special">.</span><span class="identifier">second</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span> <span class="special">)</span>
  107. <span class="special">{</span>
  108. <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">first</span> <span class="special">&lt;&lt;</span> <span class="string">"--&gt;"</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="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
  109. <span class="special">}</span>
  110. <span class="identifier">m</span><span class="special">.</span><span class="identifier">modify_key</span><span class="special">(</span> <span class="identifier">m</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">_key</span> <span class="special">=</span> <span class="string">"1"</span> <span class="special">);</span>
  111. </pre>
  112. <p>
  113. </p>
  114. <div class="calloutlist"><table border="0" summary="Callout list"><tr>
  115. <td width="5%" valign="top" align="left"><p><a name="boost_bimap.the_tutorial.unconstrained_sets.c3"></a><a href="#boost_bimap.the_tutorial.unconstrained_sets.c2"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a> </p></td>
  116. <td valign="top" align="left"><p>
  117. This range is a model of BidirectionalRange, read the docs of Boost.Range
  118. for more information.
  119. </p></td>
  120. </tr></table></div>
  121. <p>
  122. <a href="../../../../example/unconstrained_collection.cpp" target="_top">Go to source code</a>
  123. </p>
  124. </div>
  125. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  126. <td align="left"></td>
  127. <td align="right"><div class="copyright-footer">Copyright &#169; 2006-2012 Matias Capeletto<p>
  128. Distributed under the Boost Software License, Version 1.0. (See accompanying
  129. 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>)
  130. </p>
  131. </div></td>
  132. </tr></table>
  133. <hr>
  134. <div class="spirit-nav">
  135. <a accesskey="p" href="bimaps_with_user_defined_names.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="additional_information.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  136. </div>
  137. </body>
  138. </html>