differences_with_standard_maps.html 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Differences with standard maps</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="the_collection_of_relations_type.html" title="The collection of relations type">
  10. <link rel="next" href="useful_functions.html" title="Useful functions">
  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="the_collection_of_relations_type.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="useful_functions.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.differences_with_standard_maps"></a><a class="link" href="differences_with_standard_maps.html" title="Differences with standard maps">Differences
  28. with standard maps</a>
  29. </h3></div></div></div>
  30. <div class="toc"><dl class="toc">
  31. <dt><span class="section"><a href="differences_with_standard_maps.html#boost_bimap.the_tutorial.differences_with_standard_maps.insertion">Insertion</a></span></dt>
  32. <dt><span class="section"><a href="differences_with_standard_maps.html#boost_bimap.the_tutorial.differences_with_standard_maps.iterator__value_type">iterator::value_type</a></span></dt>
  33. <dt><span class="section"><a href="differences_with_standard_maps.html#boost_bimap.the_tutorial.differences_with_standard_maps.operator_____and_at__">operator[]
  34. and at()</a></span></dt>
  35. <dt><span class="section"><a href="differences_with_standard_maps.html#boost_bimap.the_tutorial.differences_with_standard_maps.complexity_of_operations">Complexity
  36. of operations</a></span></dt>
  37. </dl></div>
  38. <div class="section">
  39. <div class="titlepage"><div><div><h4 class="title">
  40. <a name="boost_bimap.the_tutorial.differences_with_standard_maps.insertion"></a><a class="link" href="differences_with_standard_maps.html#boost_bimap.the_tutorial.differences_with_standard_maps.insertion" title="Insertion">Insertion</a>
  41. </h4></div></div></div>
  42. <p>
  43. Remember that a map can be interpreted as a relation between two collections.
  44. In bimaps we have the freedom to change both collection types, imposing
  45. constrains in each of them. Some insertions that we give for granted to
  46. success in standard maps fails with bimaps. For example:
  47. </p>
  48. <pre class="programlisting"><span class="identifier">bimap</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</span> <span class="identifier">bm</span><span class="special">;</span>
  49. <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="number">1</span><span class="special">,</span><span class="string">"orange"</span><span class="special">);</span>
  50. <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="number">2</span><span class="special">,</span><span class="string">"orange"</span><span class="special">);</span> <span class="comment">// No effect! returns make_pair(iter,false)</span>
  51. </pre>
  52. <p>
  53. The insertion will only succeed if it is allowed by all views of the <code class="computeroutput"><span class="identifier">bimap</span></code>. In the next snippet we define
  54. the right collection as a multiset, when we try to insert the same two
  55. elements the second insertion is allowed by the left map view because both
  56. values are different and it is allowed by the right map view because it
  57. is a non-unique collection type.
  58. </p>
  59. <pre class="programlisting"><span class="identifier">bimap</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <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="special">&gt;</span> <span class="identifier">bm</span><span class="special">;</span>
  60. <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="number">1</span><span class="special">,</span><span class="string">"orange"</span><span class="special">);</span>
  61. <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="number">2</span><span class="special">,</span><span class="string">"orange"</span><span class="special">);</span> <span class="comment">// Insertion succeed!</span>
  62. </pre>
  63. <p>
  64. If we use a custom collection of relation type, the insertion has to be
  65. allowed by it too.
  66. </p>
  67. </div>
  68. <div class="section">
  69. <div class="titlepage"><div><div><h4 class="title">
  70. <a name="boost_bimap.the_tutorial.differences_with_standard_maps.iterator__value_type"></a><a class="link" href="differences_with_standard_maps.html#boost_bimap.the_tutorial.differences_with_standard_maps.iterator__value_type" title="iterator::value_type">iterator::value_type</a>
  71. </h4></div></div></div>
  72. <p>
  73. The relations stored in the Bimap will not be in most cases modifiable
  74. directly by iterators because both sides are used as keys of <span class="emphasis"><em>key-based</em></span>
  75. sets. When a <code class="computeroutput"><span class="identifier">bimap</span><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> left view iterator is dereferenced
  76. the return type is <span class="emphasis"><em>signature-compatible</em></span> with a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span> <span class="keyword">const</span> <span class="identifier">A</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">B</span> <span class="special">&gt;</span></code>.
  77. However there are some collection types that are not <span class="emphasis"><em>key_based</em></span>,
  78. for example list_of. If a Bimap uses one of these collection types there
  79. is no problem with modifying the data of that side. The following code
  80. is valid:
  81. </p>
  82. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special">&lt;</span> <span class="keyword">int</span><span class="special">,</span> <span class="identifier">list_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="special">&gt;</span> <span class="identifier">bm_type</span><span class="special">;</span>
  83. <span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span>
  84. <span class="identifier">bm</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">relation</span><span class="special">(</span> <span class="number">1</span><span class="special">,</span> <span class="string">"one"</span> <span class="special">)</span> <span class="special">);</span>
  85. <span class="special">...</span>
  86. <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="number">1</span><span class="special">)-&gt;</span><span class="identifier">second</span> <span class="special">=</span> <span class="string">"1"</span><span class="special">;</span> <span class="comment">// Valid</span>
  87. </pre>
  88. <p>
  89. In this case, when the iterator is dereferenced the return type is <span class="emphasis"><em>signature-compatible</em></span>
  90. with a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">int</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</span></code>.
  91. </p>
  92. <p>
  93. The following table shows the constness of the dereferenced data of each
  94. collection type of:
  95. </p>
  96. <div class="informaltable"><table class="table">
  97. <colgroup>
  98. <col>
  99. <col>
  100. </colgroup>
  101. <thead><tr>
  102. <th>
  103. <p>
  104. Side collection type
  105. </p>
  106. </th>
  107. <th>
  108. <p>
  109. Dereferenced data
  110. </p>
  111. </th>
  112. </tr></thead>
  113. <tbody>
  114. <tr>
  115. <td>
  116. <p>
  117. <code class="computeroutput"><span class="identifier">set_of</span></code>
  118. </p>
  119. </td>
  120. <td>
  121. <p>
  122. <span class="emphasis"><em>constant</em></span>
  123. </p>
  124. </td>
  125. </tr>
  126. <tr>
  127. <td>
  128. <p>
  129. <code class="computeroutput"><span class="identifier">multiset_of</span></code>
  130. </p>
  131. </td>
  132. <td>
  133. <p>
  134. <span class="emphasis"><em>constant</em></span>
  135. </p>
  136. </td>
  137. </tr>
  138. <tr>
  139. <td>
  140. <p>
  141. <code class="computeroutput"><span class="identifier">unordered_set_of</span></code>
  142. </p>
  143. </td>
  144. <td>
  145. <p>
  146. <span class="emphasis"><em>constant</em></span>
  147. </p>
  148. </td>
  149. </tr>
  150. <tr>
  151. <td>
  152. <p>
  153. <code class="computeroutput"><span class="identifier">unordered_multiset_of</span></code>
  154. </p>
  155. </td>
  156. <td>
  157. <p>
  158. <span class="emphasis"><em>constant</em></span>
  159. </p>
  160. </td>
  161. </tr>
  162. <tr>
  163. <td>
  164. <p>
  165. <code class="computeroutput"><span class="identifier">list_of</span></code>
  166. </p>
  167. </td>
  168. <td>
  169. <p>
  170. <span class="emphasis"><em>mutable</em></span>
  171. </p>
  172. </td>
  173. </tr>
  174. <tr>
  175. <td>
  176. <p>
  177. <code class="computeroutput"><span class="identifier">vector_of</span></code>
  178. </p>
  179. </td>
  180. <td>
  181. <p>
  182. <span class="emphasis"><em>mutable</em></span>
  183. </p>
  184. </td>
  185. </tr>
  186. <tr>
  187. <td>
  188. <p>
  189. <code class="computeroutput"><span class="identifier">unconstrained_set_of</span></code>
  190. </p>
  191. </td>
  192. <td>
  193. <p>
  194. <span class="emphasis"><em>mutable</em></span>
  195. </p>
  196. </td>
  197. </tr>
  198. </tbody>
  199. </table></div>
  200. <p>
  201. Here are some examples. When dereferenced the iterators returns a type
  202. that is <span class="emphasis"><em>signature-compatible</em></span> with these types.
  203. </p>
  204. <div class="informaltable"><table class="table">
  205. <colgroup>
  206. <col>
  207. <col>
  208. </colgroup>
  209. <thead><tr>
  210. <th>
  211. <p>
  212. Bimap type
  213. </p>
  214. </th>
  215. <th>
  216. <p>
  217. Signature-compatible types
  218. </p>
  219. </th>
  220. </tr></thead>
  221. <tbody>
  222. <tr>
  223. <td>
  224. <p>
  225. <code class="computeroutput"><span class="identifier">bimap</span><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>
  226. </p>
  227. </td>
  228. <td>
  229. <p>
  230. <code class="computeroutput"><span class="identifier">iterator</span> </code> <span class="bold"><strong>-&gt;</strong></span> <code class="computeroutput"><span class="identifier">relation</span><span class="special">&lt;</span><span class="keyword">const</span>
  231. <span class="identifier">A</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">B</span><span class="special">&gt;</span></code>
  232. </p>
  233. <p>
  234. <code class="computeroutput"><span class="identifier">left_iterator</span> </code>
  235. <span class="bold"><strong>-&gt;</strong></span> <code class="computeroutput"><span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">const</span>
  236. <span class="identifier">A</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">B</span><span class="special">&gt;</span></code>
  237. </p>
  238. <p>
  239. <code class="computeroutput"><span class="identifier">right_iterator</span></code>
  240. <span class="bold"><strong>-&gt;</strong></span> <code class="computeroutput"><span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">const</span>
  241. <span class="identifier">B</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">A</span><span class="special">&gt;</span></code>
  242. </p>
  243. </td>
  244. </tr>
  245. <tr>
  246. <td>
  247. <p>
  248. <code class="computeroutput"><span class="identifier">bimap</span><span class="special">&lt;</span><span class="identifier">multiset_of</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;,</span><span class="identifier">unordered_set_of</span><span class="special">&lt;</span><span class="identifier">B</span><span class="special">&gt;</span>
  249. <span class="special">&gt;</span></code>
  250. </p>
  251. </td>
  252. <td>
  253. <p>
  254. <code class="computeroutput"><span class="identifier">iterator</span> </code> <span class="bold"><strong>-&gt;</strong></span> <code class="computeroutput"><span class="identifier">relation</span><span class="special">&lt;</span><span class="keyword">const</span>
  255. <span class="identifier">A</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">B</span><span class="special">&gt;</span></code>
  256. </p>
  257. <p>
  258. <code class="computeroutput"><span class="identifier">left_iterator</span> </code>
  259. <span class="bold"><strong>-&gt;</strong></span> <code class="computeroutput"><span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">const</span>
  260. <span class="identifier">A</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">B</span><span class="special">&gt;</span></code>
  261. </p>
  262. <p>
  263. <code class="computeroutput"><span class="identifier">right_iterator</span></code>
  264. <span class="bold"><strong>-&gt;</strong></span> <code class="computeroutput"><span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">const</span>
  265. <span class="identifier">B</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">A</span><span class="special">&gt;</span></code>
  266. </p>
  267. </td>
  268. </tr>
  269. <tr>
  270. <td>
  271. <p>
  272. <code class="computeroutput"><span class="identifier">bimap</span><span class="special">&lt;</span><span class="identifier">set_of</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;,</span><span class="identifier">list_of</span><span class="special">&lt;</span><span class="identifier">B</span><span class="special">&gt;</span>
  273. <span class="special">&gt;</span></code>
  274. </p>
  275. </td>
  276. <td>
  277. <p>
  278. <code class="computeroutput"><span class="identifier">iterator</span> </code> <span class="bold"><strong>-&gt;</strong></span> <code class="computeroutput"><span class="identifier">relation</span><span class="special">&lt;</span><span class="keyword">const</span>
  279. <span class="identifier">A</span><span class="special">,</span><span class="identifier">B</span><span class="special">&gt;</span></code>
  280. </p>
  281. <p>
  282. <code class="computeroutput"><span class="identifier">left_iterator</span> </code>
  283. <span class="bold"><strong>-&gt;</strong></span> <code class="computeroutput"><span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">const</span>
  284. <span class="identifier">A</span><span class="special">,</span><span class="identifier">B</span><span class="special">&gt;</span></code>
  285. </p>
  286. <p>
  287. <code class="computeroutput"><span class="identifier">right_iterator</span></code>
  288. <span class="bold"><strong>-&gt;</strong></span> <code class="computeroutput"><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">B</span><span class="special">,</span><span class="keyword">const</span>
  289. <span class="identifier">A</span><span class="special">&gt;</span></code>
  290. </p>
  291. </td>
  292. </tr>
  293. <tr>
  294. <td>
  295. <p>
  296. <code class="computeroutput"><span class="identifier">bimap</span><span class="special">&lt;</span><span class="identifier">vector_of</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;,</span><span class="identifier">set_of</span><span class="special">&lt;</span><span class="identifier">B</span><span class="special">&gt;</span>
  297. <span class="special">&gt;</span></code>
  298. </p>
  299. </td>
  300. <td>
  301. <p>
  302. <code class="computeroutput"><span class="identifier">iterator</span> </code> <span class="bold"><strong>-&gt;</strong></span> <code class="computeroutput"><span class="identifier">relation</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span><span class="keyword">const</span>
  303. <span class="identifier">B</span><span class="special">&gt;</span></code>
  304. </p>
  305. <p>
  306. <code class="computeroutput"><span class="identifier">left_iterator</span> </code>
  307. <span class="bold"><strong>-&gt;</strong></span> <code class="computeroutput"><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span><span class="keyword">const</span>
  308. <span class="identifier">B</span><span class="special">&gt;</span></code>
  309. </p>
  310. <p>
  311. <code class="computeroutput"><span class="identifier">right_iterator</span></code>
  312. <span class="bold"><strong>-&gt;</strong></span> <code class="computeroutput"><span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">const</span>
  313. <span class="identifier">B</span><span class="special">,</span><span class="identifier">A</span><span class="special">&gt;</span></code>
  314. </p>
  315. </td>
  316. </tr>
  317. <tr>
  318. <td>
  319. <p>
  320. <code class="computeroutput"><span class="identifier">bimap</span><span class="special">&lt;</span><span class="identifier">list_of</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;,</span><span class="identifier">unconstrained_set_of</span><span class="special">&lt;</span><span class="identifier">B</span><span class="special">&gt;</span>
  321. <span class="special">&gt;</span></code>
  322. </p>
  323. </td>
  324. <td>
  325. <p>
  326. <code class="computeroutput"><span class="identifier">iterator</span> </code> <span class="bold"><strong>-&gt;</strong></span> <code class="computeroutput"><span class="identifier">relation</span><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>
  327. </p>
  328. <p>
  329. <code class="computeroutput"><span class="identifier">left_iterator</span> </code>
  330. <span class="bold"><strong>-&gt;</strong></span> <code class="computeroutput"><span class="identifier">pair</span><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>
  331. </p>
  332. <p>
  333. <code class="computeroutput"><span class="identifier">right_iterator</span></code>
  334. <span class="bold"><strong>-&gt;</strong></span> <code class="computeroutput"><span class="identifier">pair</span><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>
  335. </p>
  336. </td>
  337. </tr>
  338. </tbody>
  339. </table></div>
  340. </div>
  341. <div class="section">
  342. <div class="titlepage"><div><div><h4 class="title">
  343. <a name="boost_bimap.the_tutorial.differences_with_standard_maps.operator_____and_at__"></a><a class="link" href="differences_with_standard_maps.html#boost_bimap.the_tutorial.differences_with_standard_maps.operator_____and_at__" title="operator[] and at()">operator[]
  344. and at()</a>
  345. </h4></div></div></div>
  346. <p>
  347. <code class="computeroutput"><span class="identifier">set_of</span></code> and <code class="computeroutput"><span class="identifier">unordered_set_of</span></code> map views overload
  348. <code class="computeroutput"><span class="keyword">operator</span><span class="special">[]</span></code>
  349. to retrieve the associated data of a given key only when the other collection
  350. type is a mutable one. In these cases it works in the same way as the standard.
  351. </p>
  352. <pre class="programlisting"><span class="identifier">bimap</span><span class="special">&lt;</span> <span class="identifier">unorderd_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="identifier">list_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</span><span class="special">;</span>
  353. <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</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> <span class="comment">// Ok</span>
  354. </pre>
  355. <p>
  356. The standard defines an access function for <code class="computeroutput"><span class="identifier">map</span></code>
  357. and <code class="computeroutput"><span class="identifier">unordered_map</span></code>:
  358. </p>
  359. <pre class="programlisting"><span class="keyword">const</span> <span class="identifier">data_type</span> <span class="special">&amp;</span> <span class="identifier">at</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">key_type</span> <span class="special">&amp;</span> <span class="identifier">k</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
  360. <span class="identifier">data_type</span> <span class="special">&amp;</span> <span class="identifier">at</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">key_type</span> <span class="special">&amp;</span> <span class="identifier">k</span><span class="special">);</span>
  361. </pre>
  362. <p>
  363. These functions look for a key and returns the associated data value, but
  364. throws a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">out_of_range</span></code> exception if the key is
  365. not found.
  366. </p>
  367. <p>
  368. In bimaps the constant version of these functions is given for <code class="computeroutput"><span class="identifier">set_of</span></code> and <code class="computeroutput"><span class="identifier">unorderd_set_of</span></code>
  369. map views independently of the other collection type. The mutable version
  370. is only provided when the other collection type is mutable.
  371. </p>
  372. <p>
  373. The following examples shows the behaviour of <code class="computeroutput"><span class="identifier">at</span><span class="special">(</span><span class="identifier">key</span><span class="special">)</span></code>
  374. </p>
  375. <p>
  376. <a href="../../../../example/at_function_examples.cpp" target="_top">Go to source code</a>
  377. </p>
  378. <p>
  379. </p>
  380. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special">&lt;</span> <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="identifier">list_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>
  381. <span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span>
  382. <span class="keyword">try</span>
  383. <span class="special">{</span>
  384. <span class="identifier">bm</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">"one"</span><span class="special">)</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="comment">// throws std::out_of_range</span>
  385. <span class="special">}</span>
  386. <span class="keyword">catch</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">out_of_range</span> <span class="special">&amp;</span> <span class="identifier">e</span> <span class="special">)</span> <span class="special">{}</span>
  387. <span class="identifier">assert</span><span class="special">(</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span> <span class="special">);</span>
  388. <span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</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> <span class="comment">// Ok</span>
  389. <span class="identifier">assert</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">at</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> <span class="comment">// Ok</span>
  390. </pre>
  391. <p>
  392. </p>
  393. <p>
  394. </p>
  395. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special">&lt;</span> <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="identifier">unordered_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>
  396. <span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span>
  397. <span class="identifier">bm</span><span class="special">.</span><span class="identifier">right</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">=</span> <span class="string">"one"</span><span class="special">;</span> <span class="comment">// compilation error</span>
  398. <span class="identifier">bm</span><span class="special">.</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span> <span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">right_value_type</span><span class="special">(</span><span class="number">1</span><span class="special">,</span><span class="string">"one"</span><span class="special">)</span> <span class="special">);</span>
  399. <span class="identifier">assert</span><span class="special">(</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="number">1</span><span class="special">)</span> <span class="special">==</span> <span class="string">"one"</span> <span class="special">);</span> <span class="comment">// Ok</span>
  400. <span class="keyword">try</span>
  401. <span class="special">{</span>
  402. <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="number">2</span><span class="special">);</span> <span class="comment">// throws std::out_of_range</span>
  403. <span class="special">}</span>
  404. <span class="keyword">catch</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">out_of_range</span> <span class="special">&amp;</span> <span class="identifier">e</span> <span class="special">)</span> <span class="special">{}</span>
  405. <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="number">1</span><span class="special">)</span> <span class="special">=</span> <span class="string">"1"</span><span class="special">;</span> <span class="comment">// compilation error</span>
  406. </pre>
  407. <p>
  408. </p>
  409. </div>
  410. <div class="section">
  411. <div class="titlepage"><div><div><h4 class="title">
  412. <a name="boost_bimap.the_tutorial.differences_with_standard_maps.complexity_of_operations"></a><a class="link" href="differences_with_standard_maps.html#boost_bimap.the_tutorial.differences_with_standard_maps.complexity_of_operations" title="Complexity of operations">Complexity
  413. of operations</a>
  414. </h4></div></div></div>
  415. <p>
  416. The complexity of some operations is different in bimaps. Read <a class="link" href="../reference/bimap_reference.html#complexity_signature_explanation">the
  417. reference</a> to find the complexity of each function.
  418. </p>
  419. </div>
  420. </div>
  421. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  422. <td align="left"></td>
  423. <td align="right"><div class="copyright-footer">Copyright &#169; 2006-2012 Matias Capeletto<p>
  424. Distributed under the Boost Software License, Version 1.0. (See accompanying
  425. 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>)
  426. </p>
  427. </div></td>
  428. </tr></table>
  429. <hr>
  430. <div class="spirit-nav">
  431. <a accesskey="p" href="the_collection_of_relations_type.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="useful_functions.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  432. </div>
  433. </body>
  434. </html>