1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 2 3<html> 4<head> 5 <meta http-equiv="Content-Language" content="en-us"> 6 <meta http-equiv="Content-Type" content="text/html; charset=us-ascii"> 7 8 <title>Collection</title> 9</head> 10 11<body bgcolor="#FFFFFF" link="#0000EE" text="#000000" vlink="#551A8B" alink= 12"#FF0000"> 13 <h1><img src="../../boost.png" alt="boost logo" width="277" align="middle" 14 height="86"><br> 15 Collection</h1> 16 17 <h3>Description</h3> 18 19 <p>A Collection is a <i>concept</i> similar to the STL <a href= 20 "http://www.sgi.com/tech/stl/Container.html">Container</a> concept. A 21 Collection provides iterators for accessing a range of elements and 22 provides information about the number of elements in the Collection. 23 However, a Collection has fewer requirements than a Container. The 24 motivation for the Collection concept is that there are many useful 25 Container-like types that do not meet the full requirements of Container, 26 and many algorithms that can be written with this reduced set of 27 requirements. To summarize the reduction in requirements:</p> 28 29 <ul> 30 <li>It is not required to "own" its elements: the lifetime of an element 31 in a Collection does not have to match the lifetime of the Collection 32 object, though the lifetime of the element should cover the lifetime of 33 the Collection object.</li> 34 35 <li>The semantics of copying a Collection object is not defined (it could 36 be a deep or shallow copy or not even support copying).</li> 37 38 <li>The associated reference type of a Collection does not have to be a 39 real C++ reference.</li> 40 </ul>Because of the reduced requirements, some care must be taken when 41 writing code that is meant to be generic for all Collection types. In 42 particular, a Collection object should be passed by-reference since 43 assumptions can not be made about the behaviour of the copy constructor. 44 45 <h3>Associated types</h3> 46 47 <table border summary=""> 48 <tr> 49 <td valign="top">Value type</td> 50 51 <td valign="top"><tt>X::value_type</tt></td> 52 53 <td valign="top">The type of the object stored in a Collection. If the 54 Collection is <i>mutable</i> then the value type must be <a href= 55 "http://www.sgi.com/tech/stl/Assignable.html">Assignable</a>. Otherwise 56 the value type must be <a href= 57 "./CopyConstructible.html">CopyConstructible</a>.</td> 58 </tr> 59 60 <tr> 61 <td valign="top">Iterator type</td> 62 63 <td valign="top"><tt>X::iterator</tt></td> 64 65 <td valign="top">The type of iterator used to iterate through a 66 Collection's elements. The iterator's value type is expected to be the 67 Collection's value type. A conversion from the iterator type to the 68 const iterator type must exist. The iterator type must be an <a href= 69 "http://www.sgi.com/tech/stl/InputIterator.html">InputIterator</a>.</td> 70 </tr> 71 72 <tr> 73 <td valign="top">Const iterator type</td> 74 75 <td valign="top"><tt>X::const_iterator</tt></td> 76 77 <td valign="top">A type of iterator that may be used to examine, but 78 not to modify, a Collection's elements.</td> 79 </tr> 80 81 <tr> 82 <td valign="top">Reference type</td> 83 84 <td valign="top"><tt>X::reference</tt></td> 85 86 <td valign="top">A type that behaves like a reference to the 87 Collection's value type. <a href="#n1">[1]</a></td> 88 </tr> 89 90 <tr> 91 <td valign="top">Const reference type</td> 92 93 <td valign="top"><tt>X::const_reference</tt></td> 94 95 <td valign="top">A type that behaves like a const reference to the 96 Collection's value type.</td> 97 </tr> 98 99 <tr> 100 <td valign="top">Pointer type</td> 101 102 <td valign="top"><tt>X::pointer</tt></td> 103 104 <td valign="top">A type that behaves as a pointer to the Collection's 105 value type.</td> 106 </tr> 107 108 <tr> 109 <td valign="top">Distance type</td> 110 111 <td valign="top"><tt>X::difference_type</tt></td> 112 113 <td valign="top">A signed integral type used to represent the distance 114 between two of the Collection's iterators. This type must be the same 115 as the iterator's distance type.</td> 116 </tr> 117 118 <tr> 119 <td valign="top">Size type</td> 120 121 <td valign="top"><tt>X::size_type</tt></td> 122 123 <td valign="top">An unsigned integral type that can represent any 124 nonnegative value of the Collection's distance type.</td> 125 </tr> 126 </table> 127 128 <h3>Notation</h3> 129 130 <table summary=""> 131 <tr> 132 <td valign="top"><tt>X</tt></td> 133 134 <td valign="top">A type that is a model of Collection.</td> 135 </tr> 136 137 <tr> 138 <td valign="top"><tt>a</tt>, <tt>b</tt></td> 139 140 <td valign="top">Object of type <tt>X</tt>.</td> 141 </tr> 142 143 <tr> 144 <td valign="top"><tt>T</tt></td> 145 146 <td valign="top">The value type of <tt>X</tt>.</td> 147 </tr> 148 </table> 149 150 <h3>Valid expressions</h3> 151 152 <p>The following expressions must be valid.</p> 153 154 <table border summary=""> 155 <tr> 156 <th>Name</th> 157 158 <th>Expression</th> 159 160 <th>Return type</th> 161 </tr> 162 163 <tr> 164 <td valign="top">Beginning of range</td> 165 166 <td valign="top"><tt>a.begin()</tt></td> 167 168 <td valign="top"><tt>iterator</tt> if <tt>a</tt> is mutable, 169 <tt>const_iterator</tt> otherwise</td> 170 </tr> 171 172 <tr> 173 <td valign="top">End of range</td> 174 175 <td valign="top"><tt>a.end()</tt></td> 176 177 <td valign="top"><tt>iterator</tt> if <tt>a</tt> is mutable, 178 <tt>const_iterator</tt> otherwise</td> 179 </tr> 180 181 <tr> 182 <td valign="top">Size</td> 183 184 <td valign="top"><tt>a.size()</tt></td> 185 186 <td valign="top"><tt>size_type</tt></td> 187 </tr><!-- 188<TR> 189<TD VAlign=top> 190Maximum size 191</TD> 192<TD VAlign=top> 193<tt>a.max_size()</tt> 194</TD> 195<TD VAlign=top> 196<tt>size_type</tt> 197</TD> 198</TR> 199--> 200 201 <tr> 202 <td valign="top">Empty Collection</td> 203 204 <td valign="top"><tt>a.empty()</tt></td> 205 206 <td valign="top">Convertible to <tt>bool</tt></td> 207 </tr> 208 209 <tr> 210 <td valign="top">Swap</td> 211 212 <td valign="top"><tt>a.swap(b)</tt></td> 213 214 <td valign="top"><tt>void</tt></td> 215 </tr> 216 </table> 217 218 <h3>Expression semantics</h3> 219 220 <table border summary=""> 221 <tr> 222 <th>Name</th> 223 224 <th>Expression</th> 225 226 <th>Semantics</th> 227 228 <th>Postcondition</th> 229 </tr> 230 231 <tr> 232 <td valign="top">Beginning of range</td> 233 234 <td valign="top"><tt>a.begin()</tt></td> 235 236 <td valign="top">Returns an iterator pointing to the first element in 237 the Collection.</td> 238 239 <td valign="top"><tt>a.begin()</tt> is either dereferenceable or 240 past-the-end. It is past-the-end if and only if <tt>a.size() == 241 0</tt>.</td> 242 </tr> 243 244 <tr> 245 <td valign="top">End of range</td> 246 247 <td valign="top"><tt>a.end()</tt></td> 248 249 <td valign="top">Returns an iterator pointing one past the last element 250 in the Collection.</td> 251 252 <td valign="top"><tt>a.end()</tt> is past-the-end.</td> 253 </tr> 254 255 <tr> 256 <td valign="top">Size</td> 257 258 <td valign="top"><tt>a.size()</tt></td> 259 260 <td valign="top">Returns the size of the Collection, that is, its 261 number of elements.</td> 262 263 <td valign="top"><tt>a.size() >= 0</tt></td> 264 </tr><!-- 265<TR> 266<TD VAlign=top> 267Maximum size 268</TD> 269<TD VAlign=top> 270<tt>a.max_size()</tt> 271</TD> 272<TD VAlign=top> 273 274</TD> 275<TD VAlign=top> 276Returns the largest size that this Collection can ever have. <A href="#8">[8]</A> 277</TD> 278<TD VAlign=top> 279<tt>a.max_size() >= 0 && a.max_size() >= a.size()</tt> 280</TD> 281</TR> 282 --> 283 284 <tr> 285 <td valign="top">Empty Collection</td> 286 287 <td valign="top"><tt>a.empty()</tt></td> 288 289 <td valign="top">Equivalent to <tt>a.size() == 0</tt>. (But possibly 290 faster.)</td> 291 292 <td valign="top"> </td> 293 </tr> 294 295 <tr> 296 <td valign="top">Swap</td> 297 298 <td valign="top"><tt>a.swap(b)</tt></td> 299 300 <td valign="top">Equivalent to <tt>swap(a,b)</tt></td> 301 302 <td valign="top"> </td> 303 </tr> 304 </table> 305 306 <h3>Complexity guarantees</h3> 307 308 <p><tt>begin()</tt> and <tt>end()</tt> are amortized constant time.</p> 309 310 <p><tt>size()</tt> is at most linear in the Collection's size. 311 <tt>empty()</tt> is amortized constant time.</p> 312 313 <p><tt>swap()</tt> is at most linear in the size of the two 314 collections.</p> 315 316 <h3>Invariants</h3> 317 318 <table border summary=""> 319 <tr> 320 <td valign="top">Valid range</td> 321 322 <td valign="top">For any Collection <tt>a</tt>, <tt>[a.begin(), 323 a.end())</tt> is a valid range.</td> 324 </tr> 325 326 <tr> 327 <td valign="top">Range size</td> 328 329 <td valign="top"><tt>a.size()</tt> is equal to the distance from 330 <tt>a.begin()</tt> to <tt>a.end()</tt>.</td> 331 </tr> 332 333 <tr> 334 <td valign="top">Completeness</td> 335 336 <td valign="top">An algorithm that iterates through the range 337 <tt>[a.begin(), a.end())</tt> will pass through every element of 338 <tt>a</tt>.</td> 339 </tr> 340 </table> 341 342 <h3>Models</h3> 343 344 <ul> 345 <li><tt>array</tt></li> 346 347 <li><tt>array_ptr</tt></li> 348 349 <li><tt>vector<bool></tt></li> 350 </ul> 351 352 <h3>Collection Refinements</h3> 353 354 <p>There are quite a few concepts that refine the Collection concept, 355 similar to the concepts that refine the Container concept. Here is a brief 356 overview of the refining concepts.</p> 357 358 <h4>ForwardCollection</h4> 359 360 <p>The elements are arranged in some order that does not change 361 spontaneously from one iteration to the next. As a result, a 362 ForwardCollection is <a href= 363 "http://www.sgi.com/tech/stl/EqualityComparable.html">EqualityComparable</a> 364 and <a href= 365 "http://www.sgi.com/tech/stl/LessThanComparable.html">LessThanComparable</a>. 366 In addition, the iterator type of a ForwardCollection is a 367 MultiPassInputIterator which is just an InputIterator with the added 368 requirements that the iterator can be used to make multiple passes through 369 a range, and that if <tt>it1 == it2</tt> and <tt>it1</tt> is 370 dereferenceable then <tt>++it1 == ++it2</tt>. The ForwardCollection also 371 has a <tt>front()</tt> method.</p> 372 373 <table border summary=""> 374 <tr> 375 <th>Name</th> 376 377 <th>Expression</th> 378 379 <th>Return type</th> 380 381 <th>Semantics</th> 382 </tr> 383 384 <tr> 385 <td valign="top">Front</td> 386 387 <td valign="top"><tt>a.front()</tt></td> 388 389 <td valign="top"><tt>reference</tt> if <tt>a</tt> is mutable,<br> 390 <tt>const_reference</tt> otherwise.</td> 391 392 <td valign="top">Equivalent to <tt>*(a.begin())</tt>.</td> 393 </tr> 394 </table> 395 396 <h4>ReversibleCollection</h4> 397 398 <p>The container provides access to iterators that traverse in both 399 directions (forward and reverse). The iterator type must meet all of the 400 requirements of <a href= 401 "http://www.sgi.com/tech/stl/BidirectionalIterator.html">BidirectionalIterator</a> 402 except that the reference type does not have to be a real C++ reference. 403 The ReversibleCollection adds the following requirements to those of 404 ForwardCollection.</p> 405 406 <table border summary=""> 407 <tr> 408 <th>Name</th> 409 410 <th>Expression</th> 411 412 <th>Return type</th> 413 414 <th>Semantics</th> 415 </tr> 416 417 <tr> 418 <td valign="top">Beginning of range</td> 419 420 <td valign="top"><tt>a.rbegin()</tt></td> 421 422 <td valign="top"><tt>reverse_iterator</tt> if <tt>a</tt> is mutable, 423 <tt>const_reverse_iterator</tt> otherwise.</td> 424 425 <td valign="top">Equivalent to 426 <tt>X::reverse_iterator(a.end())</tt>.</td> 427 </tr> 428 429 <tr> 430 <td valign="top">End of range</td> 431 432 <td valign="top"><tt>a.rend()</tt></td> 433 434 <td valign="top"><tt>reverse_iterator</tt> if <tt>a</tt> is mutable, 435 <tt>const_reverse_iterator</tt> otherwise.</td> 436 437 <td valign="top">Equivalent to 438 <tt>X::reverse_iterator(a.begin())</tt>.</td> 439 </tr> 440 441 <tr> 442 <td valign="top">Back</td> 443 444 <td valign="top"><tt>a.back()</tt></td> 445 446 <td valign="top"><tt>reference</tt> if <tt>a</tt> is mutable,<br> 447 <tt>const_reference</tt> otherwise.</td> 448 449 <td valign="top">Equivalent to <tt>*(--a.end())</tt>.</td> 450 </tr> 451 </table> 452 453 <h4>SequentialCollection</h4> 454 455 <p>The elements are arranged in a strict linear order. No extra methods are 456 required.</p> 457 458 <h4>RandomAccessCollection</h4> 459 460 <p>The iterators of a RandomAccessCollection satisfy all of the 461 requirements of <a href= 462 "http://www.sgi.com/tech/stl/RandomAccessIterator.html">RandomAccessIterator</a> 463 except that the reference type does not have to be a real C++ reference. In 464 addition, a RandomAccessCollection provides an element access operator.</p> 465 466 <table border summary=""> 467 <tr> 468 <th>Name</th> 469 470 <th>Expression</th> 471 472 <th>Return type</th> 473 474 <th>Semantics</th> 475 </tr> 476 477 <tr> 478 <td valign="top">Element Access</td> 479 480 <td valign="top"><tt>a[n]</tt></td> 481 482 <td valign="top"><tt>reference</tt> if <tt>a</tt> is mutable, 483 <tt>const_reference</tt> otherwise.</td> 484 485 <td valign="top">Returns the nth element of the Collection. <tt>n</tt> 486 must be convertible to <tt>size_type</tt>. Precondition: <tt>0 <= n 487 < a.size()</tt>.</td> 488 </tr> 489 </table> 490 491 <h3>Notes</h3> 492 493 <p><a name="n1" id="n1">[1]</a> The reference type does not have to be a 494 real C++ reference. The requirements of the reference type depend on the 495 context within which the Collection is being used. Specifically it depends 496 on the requirements the context places on the value type of the Collection. 497 The reference type of the Collection must meet the same requirements as the 498 value type. In addition, the reference objects must be equivalent to the 499 value type objects in the collection (which is trivially true if they are 500 the same object). Also, in a mutable Collection, an assignment to the 501 reference object must result in an assignment to the object in the 502 Collection (again, which is trivially true if they are the same object, but 503 non-trivial if the reference type is a proxy class).</p> 504 505 <h3>See also</h3> 506 507 <p><a href= 508 "http://www.sgi.com/tech/stl/Container.html">Container</a><br></p> 509 <hr> 510 511 <p><a href="http://validator.w3.org/check?uri=referer"><img border="0" src= 512 "../../doc/images/valid-html401.png" alt="Valid HTML 4.01 Transitional" 513 height="31" width="88"></a></p> 514 515 <p>Revised 516 <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->05 517 December, 2006<!--webbot bot="Timestamp" endspan i-checksum="38516" --></p> 518 519 <table summary=""> 520 <tr valign="top"> 521 <td nowrap><i>Copyright © 2000</i></td> 522 523 <td><i><a href="http://www.boost.org/people/jeremy_siek.htm">Jeremy 524 Siek</a>, Univ.of Notre Dame and C++ Library & Compiler Group/SGI 525 (<a href="mailto:jsiek@engr.sgi.com">jsiek@engr.sgi.com</a>)</i></td> 526 </tr> 527 </table> 528 529 <p><i>Distributed under the Boost Software License, Version 1.0. (See 530 accompanying file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or 531 copy at <a href= 532 "http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>)</i></p> 533</body> 534</html> 535