1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Bimaps with user defined names</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 1. Boost.Bimap"> 8<link rel="up" href="../the_tutorial.html" title="The tutorial"> 9<link rel="prev" href="useful_functions.html" title="Useful functions"> 10<link rel="next" href="unconstrained_sets.html" title="Unconstrained Sets"> 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="useful_functions.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="unconstrained_sets.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.bimaps_with_user_defined_names"></a><a class="link" href="bimaps_with_user_defined_names.html" title="Bimaps with user defined names">Bimaps 28 with user defined names</a> 29</h3></div></div></div> 30<p> 31 In the following example, the library user inserted comments to guide future 32 programmers: 33 </p> 34<p> 35 <a href="../../../../example/user_defined_names.cpp" target="_top">Go to source code</a> 36 </p> 37<p> 38</p> 39<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">bimap</span> 40<span class="special"><</span> 41 <span class="identifier">multiset_of</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">>,</span> 42 <span class="keyword">int</span> 43 44<span class="special">></span> <span class="identifier">People</span><span class="special">;</span> 45 46<span class="identifier">People</span> <span class="identifier">people</span><span class="special">;</span> 47 48<span class="comment">// ...</span> 49 50<span class="keyword">int</span> <span class="identifier">user_id</span><span class="special">;</span> 51<span class="identifier">std</span><span class="special">::</span><span class="identifier">cin</span> <span class="special">>></span> <span class="identifier">user_id</span><span class="special">;</span> 52 53<span class="comment">// people.right : map<id,name></span> 54 55<span class="identifier">People</span><span class="special">::</span><span class="identifier">right_const_iterator</span> <span class="identifier">id_iter</span> <span class="special">=</span> <span class="identifier">people</span><span class="special">.</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">user_id</span><span class="special">);</span> 56<span class="keyword">if</span><span class="special">(</span> <span class="identifier">id_iter</span> <span class="special">!=</span> <span class="identifier">people</span><span class="special">.</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span> <span class="special">)</span> 57<span class="special">{</span> 58 <span class="comment">// first : id</span> 59 <span class="comment">// second : name</span> 60 61 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"name: "</span> <span class="special"><<</span> <span class="identifier">id_iter</span><span class="special">-></span><span class="identifier">second</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span> 62 <span class="special"><<</span> <span class="string">"id: "</span> <span class="special"><<</span> <span class="identifier">id_iter</span><span class="special">-></span><span class="identifier">first</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 63<span class="special">}</span> 64<span class="keyword">else</span> 65<span class="special">{</span> 66 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Unknown id, users are:"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 67 68 <span class="comment">// people.left : map<name,id></span> 69 70 <span class="keyword">for</span><span class="special">(</span> <span class="identifier">People</span><span class="special">::</span><span class="identifier">left_const_iterator</span> 71 <span class="identifier">name_iter</span> <span class="special">=</span> <span class="identifier">people</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> 72 <span class="identifier">iend</span> <span class="special">=</span> <span class="identifier">people</span><span class="special">.</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> 73 74 <span class="identifier">name_iter</span> <span class="special">!=</span> <span class="identifier">iend</span><span class="special">;</span> <span class="special">++</span><span class="identifier">name_iter</span> <span class="special">)</span> 75 <span class="special">{</span> 76 <span class="comment">// first : name</span> 77 <span class="comment">// second : id</span> 78 79 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"name: "</span> <span class="special"><<</span> <span class="identifier">name_iter</span><span class="special">-></span><span class="identifier">first</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span> 80 <span class="special"><<</span> <span class="string">"id: "</span> <span class="special"><<</span> <span class="identifier">name_iter</span><span class="special">-></span><span class="identifier">second</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 81 <span class="special">}</span> 82<span class="special">}</span> 83</pre> 84<p> 85 </p> 86<p> 87 In Boost.Bimap there is a better way to document the code and in the meantime 88 helping you to write more maintainable and readable code. You can tag the 89 two collections of the bimap so they can be accessed by more descriptive 90 names. 91 </p> 92<p> 93 <span class="inlinemediaobject"><img src="../../images/bimap/tagged.png" alt="tagged"></span> 94 </p> 95<p> 96 A tagged type is a type that has been labelled using a tag. A tag is any 97 valid C++ type. In a bimap, the types are always tagged. If you do not specify 98 your own tag, the container uses <code class="computeroutput"><span class="identifier">member_at</span><span class="special">::</span><span class="identifier">left</span></code> 99 and <code class="computeroutput"><span class="identifier">member_at</span><span class="special">::</span><span class="identifier">right</span></code> to tag the left and right sides respectively. 100 In order to specify a custom tag, the type of each side has to be tagged. 101 Tagging a type is very simple: 102 </p> 103<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">tagged</span><span class="special"><</span> <span class="keyword">int</span><span class="special">,</span> <span class="identifier">a_tag</span> <span class="special">></span> <span class="identifier">tagged_int</span><span class="special">;</span> 104</pre> 105<p> 106 Now we can rewrite the example: 107 </p> 108<p> 109 <a href="../../../../example/user_defined_names.cpp" target="_top">Go to source code</a> 110 </p> 111<p> 112</p> 113<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">id</span> <span class="special">{};</span> <span class="comment">// Tag for the identification number</span> 114<span class="keyword">struct</span> <span class="identifier">name</span> <span class="special">{};</span> <span class="comment">// Tag for the name of the person</span> 115 116<span class="keyword">typedef</span> <span class="identifier">bimap</span> 117<span class="special"><</span> 118 <span class="identifier">tagged</span><span class="special"><</span> <span class="keyword">int</span> <span class="special">,</span> <span class="identifier">id</span> <span class="special">></span> <span class="special">,</span> 119 <span class="identifier">multiset_of</span><span class="special"><</span> <span class="identifier">tagged</span><span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="identifier">name</span> <span class="special">></span> <span class="special">></span> 120 121<span class="special">></span> <span class="identifier">People</span><span class="special">;</span> 122 123<span class="identifier">People</span> <span class="identifier">people</span><span class="special">;</span> 124 125<span class="comment">// ...</span> 126 127<span class="keyword">int</span> <span class="identifier">user_id</span><span class="special">;</span> 128<span class="identifier">std</span><span class="special">::</span><span class="identifier">cin</span> <span class="special">>></span> <span class="identifier">user_id</span><span class="special">;</span> 129 130<span class="identifier">People</span><span class="special">::</span><span class="identifier">map_by</span><span class="special"><</span><span class="identifier">id</span><span class="special">>::</span><span class="identifier">const_iterator</span> <span class="identifier">id_iter</span> <span class="special">=</span> <span class="identifier">people</span><span class="special">.</span><span class="identifier">by</span><span class="special"><</span><span class="identifier">id</span><span class="special">>().</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">user_id</span><span class="special">);</span> 131<span class="keyword">if</span><span class="special">(</span> <span class="identifier">id_iter</span> <span class="special">!=</span> <span class="identifier">people</span><span class="special">.</span><span class="identifier">by</span><span class="special"><</span><span class="identifier">id</span><span class="special">>().</span><span class="identifier">end</span><span class="special">()</span> <span class="special">)</span> 132<span class="special">{</span> 133 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"name: "</span> <span class="special"><<</span> <span class="identifier">id_iter</span><span class="special">-></span><span class="identifier">get</span><span class="special"><</span><span class="identifier">name</span><span class="special">>()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span> 134 <span class="special"><<</span> <span class="string">"id: "</span> <span class="special"><<</span> <span class="identifier">id_iter</span><span class="special">-></span><span class="identifier">get</span><span class="special"><</span><span class="identifier">id</span><span class="special">>()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 135<span class="special">}</span> 136<span class="keyword">else</span> 137<span class="special">{</span> 138 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Unknown id, users are:"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 139 140 <span class="keyword">for</span><span class="special">(</span> <span class="identifier">People</span><span class="special">::</span><span class="identifier">map_by</span><span class="special"><</span><span class="identifier">name</span><span class="special">>::</span><span class="identifier">const_iterator</span> 141 <span class="identifier">name_iter</span> <span class="special">=</span> <span class="identifier">people</span><span class="special">.</span><span class="identifier">by</span><span class="special"><</span><span class="identifier">name</span><span class="special">>().</span><span class="identifier">begin</span><span class="special">(),</span> 142 <span class="identifier">iend</span> <span class="special">=</span> <span class="identifier">people</span><span class="special">.</span><span class="identifier">by</span><span class="special"><</span><span class="identifier">name</span><span class="special">>().</span><span class="identifier">end</span><span class="special">();</span> 143 144 <span class="identifier">name_iter</span> <span class="special">!=</span> <span class="identifier">iend</span><span class="special">;</span> <span class="special">++</span><span class="identifier">name_iter</span> <span class="special">)</span> 145 <span class="special">{</span> 146 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"name: "</span> <span class="special"><<</span> <span class="identifier">name_iter</span><span class="special">-></span><span class="identifier">get</span><span class="special"><</span><span class="identifier">name</span><span class="special">>()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span> 147 <span class="special"><<</span> <span class="string">"id: "</span> <span class="special"><<</span> <span class="identifier">name_iter</span><span class="special">-></span><span class="identifier">get</span><span class="special"><</span><span class="identifier">id</span><span class="special">>()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 148 <span class="special">}</span> 149<span class="special">}</span> 150</pre> 151<p> 152 </p> 153<p> 154 Here is a list of common structures in both tagged and untagged versions. 155 Remember that when the bimap has user defined tags you can still use the 156 untagged version structures. 157 </p> 158<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">Left</span> <span class="special">{};</span> 159<span class="keyword">struct</span> <span class="identifier">Right</span> <span class="special">{};</span> 160<span class="keyword">typedef</span> <span class="identifier">bimap</span><span class="special"><</span> 161 <span class="identifier">multiset_of</span><span class="special"><</span> <span class="identifier">tagged</span><span class="special"><</span> <span class="keyword">int</span><span class="special">,</span> <span class="identifier">Left</span> <span class="special">></span> <span class="special">>,</span> 162 <span class="identifier">unordered_set_of</span><span class="special"><</span> <span class="identifier">tagged</span><span class="special"><</span> <span class="keyword">int</span><span class="special">,</span> <span class="identifier">Right</span> <span class="special">></span> <span class="special">></span> 163<span class="special">></span> <span class="identifier">bm_type</span><span class="special">;</span> 164 165<span class="identifier">bm_type</span> <span class="identifier">bm</span><span class="special">;</span> 166 167<span class="comment">//...</span> 168 169<span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">iter</span> <span class="special">=</span> <span class="identifier">bm</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> 170<span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">left_iterator</span> <span class="identifier">left_iter</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">begin</span><span class="special">();</span> 171<span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">right_iterator</span> <span class="identifier">right_iter</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">begin</span><span class="special">();</span> 172</pre> 173<div class="table"> 174<a name="boost_bimap.the_tutorial.bimaps_with_user_defined_names.t0"></a><p class="title"><b>Table 1.3. Equivalence of expressions using user defined names</b></p> 175<div class="table-contents"><table class="table" summary="Equivalence of expressions using user defined names"> 176<colgroup> 177<col> 178<col> 179</colgroup> 180<thead><tr> 181<th> 182 <p> 183 Untagged version 184 </p> 185 </th> 186<th> 187 <p> 188 Tagged version 189 </p> 190 </th> 191</tr></thead> 192<tbody> 193<tr> 194<td> 195 <p> 196 <code class="computeroutput"><span class="identifier">bm</span><span class="special">.</span><span class="identifier">left</span></code> 197 </p> 198 </td> 199<td> 200 <p> 201 <code class="computeroutput"><span class="identifier">bm</span><span class="special">.</span><span class="identifier">by</span><span class="special"><</span><span class="identifier">Left</span><span class="special">>()</span></code> 202 </p> 203 </td> 204</tr> 205<tr> 206<td> 207 <p> 208 <code class="computeroutput"><span class="identifier">bm</span><span class="special">.</span><span class="identifier">right</span></code> 209 </p> 210 </td> 211<td> 212 <p> 213 <code class="computeroutput"><span class="identifier">bm</span><span class="special">.</span><span class="identifier">by</span><span class="special"><</span><span class="identifier">Right</span><span class="special">>()</span></code> 214 </p> 215 </td> 216</tr> 217<tr> 218<td> 219 <p> 220 <code class="computeroutput"><span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">left_map</span></code> 221 </p> 222 </td> 223<td> 224 <p> 225 <code class="computeroutput"><span class="identifier">bm</span><span class="special">::</span><span class="identifier">map_by</span><span class="special"><</span><span class="identifier">Left</span><span class="special">>::</span><span class="identifier">type</span></code> 226 </p> 227 </td> 228</tr> 229<tr> 230<td> 231 <p> 232 <code class="computeroutput"><span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">right_value_type</span></code> 233 </p> 234 </td> 235<td> 236 <p> 237 <code class="computeroutput"><span class="identifier">bm</span><span class="special">::</span><span class="identifier">map_by</span><span class="special"><</span><span class="identifier">Right</span><span class="special">>::</span><span class="identifier">value_type</span></code> 238 </p> 239 </td> 240</tr> 241<tr> 242<td> 243 <p> 244 <code class="computeroutput"><span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">left_iterator</span></code> 245 </p> 246 </td> 247<td> 248 <p> 249 <code class="computeroutput"><span class="identifier">bm</span><span class="special">::</span><span class="identifier">map_by</span><span class="special"><</span><span class="identifier">Left</span><span class="special">>::</span><span class="identifier">iterator</span></code> 250 </p> 251 </td> 252</tr> 253<tr> 254<td> 255 <p> 256 <code class="computeroutput"><span class="identifier">bm_type</span><span class="special">::</span><span class="identifier">right_const_iterator</span></code> 257 </p> 258 </td> 259<td> 260 <p> 261 <code class="computeroutput"><span class="identifier">bm</span><span class="special">::</span><span class="identifier">map_by</span><span class="special"><</span><span class="identifier">Right</span><span class="special">>::</span><span class="identifier">const_iterator</span></code> 262 </p> 263 </td> 264</tr> 265<tr> 266<td> 267 <p> 268 <code class="computeroutput"><span class="identifier">iter</span><span class="special">-></span><span class="identifier">left</span></code> 269 </p> 270 </td> 271<td> 272 <p> 273 <code class="computeroutput"><span class="identifier">iter</span><span class="special">-></span><span class="identifier">get</span><span class="special"><</span><span class="identifier">Left</span><span class="special">>()</span></code> 274 </p> 275 </td> 276</tr> 277<tr> 278<td> 279 <p> 280 <code class="computeroutput"><span class="identifier">iter</span><span class="special">-></span><span class="identifier">right</span></code> 281 </p> 282 </td> 283<td> 284 <p> 285 <code class="computeroutput"><span class="identifier">iter</span><span class="special">-></span><span class="identifier">get</span><span class="special"><</span><span class="identifier">Right</span><span class="special">>()</span></code> 286 </p> 287 </td> 288</tr> 289<tr> 290<td> 291 <p> 292 <code class="computeroutput"><span class="identifier">left_iter</span><span class="special">-></span><span class="identifier">first</span></code> 293 </p> 294 </td> 295<td> 296 <p> 297 <code class="computeroutput"><span class="identifier">left_iter</span><span class="special">-></span><span class="identifier">get</span><span class="special"><</span><span class="identifier">Left</span><span class="special">>()</span></code> 298 </p> 299 </td> 300</tr> 301<tr> 302<td> 303 <p> 304 <code class="computeroutput"><span class="identifier">left_iter</span><span class="special">-></span><span class="identifier">second</span></code> 305 </p> 306 </td> 307<td> 308 <p> 309 <code class="computeroutput"><span class="identifier">left_iter</span><span class="special">-></span><span class="identifier">get</span><span class="special"><</span><span class="identifier">Right</span><span class="special">>()</span></code> 310 </p> 311 </td> 312</tr> 313<tr> 314<td> 315 <p> 316 <code class="computeroutput"><span class="identifier">right_iter</span><span class="special">-></span><span class="identifier">first</span></code> 317 </p> 318 </td> 319<td> 320 <p> 321 <code class="computeroutput"><span class="identifier">right_iter</span><span class="special">-></span><span class="identifier">get</span><span class="special"><</span><span class="identifier">Right</span><span class="special">>()</span></code> 322 </p> 323 </td> 324</tr> 325<tr> 326<td> 327 <p> 328 <code class="computeroutput"><span class="identifier">right_iter</span><span class="special">-></span><span class="identifier">second</span></code> 329 </p> 330 </td> 331<td> 332 <p> 333 <code class="computeroutput"><span class="identifier">right_iter</span><span class="special">-></span><span class="identifier">get</span><span class="special"><</span><span class="identifier">Left</span><span class="special">>()</span></code> 334 </p> 335 </td> 336</tr> 337<tr> 338<td> 339 <p> 340 <code class="computeroutput"><span class="identifier">bm</span><span class="special">.</span><span class="identifier">project_left</span><span class="special">(</span><span class="identifier">iter</span><span class="special">)</span></code> 341 </p> 342 </td> 343<td> 344 <p> 345 <code class="computeroutput"><span class="identifier">bm</span><span class="special">.</span><span class="identifier">project</span><span class="special"><</span><span class="identifier">Left</span><span class="special">>(</span><span class="identifier">iter</span><span class="special">)</span></code> 346 </p> 347 </td> 348</tr> 349<tr> 350<td> 351 <p> 352 <code class="computeroutput"><span class="identifier">bm</span><span class="special">.</span><span class="identifier">project_right</span><span class="special">(</span><span class="identifier">iter</span><span class="special">)</span></code> 353 </p> 354 </td> 355<td> 356 <p> 357 <code class="computeroutput"><span class="identifier">bm</span><span class="special">.</span><span class="identifier">project</span><span class="special"><</span><span class="identifier">Right</span><span class="special">>(</span><span class="identifier">iter</span><span class="special">)</span></code> 358 </p> 359 </td> 360</tr> 361</tbody> 362</table></div> 363</div> 364<br class="table-break"> 365</div> 366<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 367<td align="left"></td> 368<td align="right"><div class="copyright-footer">Copyright © 2006-2012 Matias Capeletto<p> 369 Distributed under the Boost Software License, Version 1.0. (See accompanying 370 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>) 371 </p> 372</div></td> 373</tr></table> 374<hr> 375<div class="spirit-nav"> 376<a accesskey="p" href="useful_functions.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="unconstrained_sets.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> 377</div> 378</body> 379</html> 380