summaryrefslogtreecommitdiff
path: root/libs/utility/Collection.html
blob: b92ddd6eeb0388a088311eaeb5dc964d1e72a5f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
  <meta http-equiv="Content-Language" content="en-us">
  <meta http-equiv="Content-Type" content="text/html; charset=us-ascii">

  <title>Collection</title>
</head>

<body bgcolor="#FFFFFF" link="#0000EE" text="#000000" vlink="#551A8B" alink=
"#FF0000">
  <h1><img src="../../boost.png" alt="boost logo" width="277" align="middle"
  height="86"><br>
  Collection</h1>

  <h3>Description</h3>

  <p>A Collection is a <i>concept</i> similar to the STL <a href=
  "http://www.sgi.com/tech/stl/Container.html">Container</a> concept. A
  Collection provides iterators for accessing a range of elements and
  provides information about the number of elements in the Collection.
  However, a Collection has fewer requirements than a Container. The
  motivation for the Collection concept is that there are many useful
  Container-like types that do not meet the full requirements of Container,
  and many algorithms that can be written with this reduced set of
  requirements. To summarize the reduction in requirements:</p>

  <ul>
    <li>It is not required to "own" its elements: the lifetime of an element
    in a Collection does not have to match the lifetime of the Collection
    object, though the lifetime of the element should cover the lifetime of
    the Collection object.</li>

    <li>The semantics of copying a Collection object is not defined (it could
    be a deep or shallow copy or not even support copying).</li>

    <li>The associated reference type of a Collection does not have to be a
    real C++ reference.</li>
  </ul>Because of the reduced requirements, some care must be taken when
  writing code that is meant to be generic for all Collection types. In
  particular, a Collection object should be passed by-reference since
  assumptions can not be made about the behaviour of the copy constructor.

  <h3>Associated types</h3>

  <table border summary="">
    <tr>
      <td valign="top">Value type</td>

      <td valign="top"><tt>X::value_type</tt></td>

      <td valign="top">The type of the object stored in a Collection. If the
      Collection is <i>mutable</i> then the value type must be <a href=
      "http://www.sgi.com/tech/stl/Assignable.html">Assignable</a>. Otherwise
      the value type must be <a href=
      "./CopyConstructible.html">CopyConstructible</a>.</td>
    </tr>

    <tr>
      <td valign="top">Iterator type</td>

      <td valign="top"><tt>X::iterator</tt></td>

      <td valign="top">The type of iterator used to iterate through a
      Collection's elements. The iterator's value type is expected to be the
      Collection's value type. A conversion from the iterator type to the
      const iterator type must exist. The iterator type must be an <a href=
      "http://www.sgi.com/tech/stl/InputIterator.html">InputIterator</a>.</td>
    </tr>

    <tr>
      <td valign="top">Const iterator type</td>

      <td valign="top"><tt>X::const_iterator</tt></td>

      <td valign="top">A type of iterator that may be used to examine, but
      not to modify, a Collection's elements.</td>
    </tr>

    <tr>
      <td valign="top">Reference type</td>

      <td valign="top"><tt>X::reference</tt></td>

      <td valign="top">A type that behaves like a reference to the
      Collection's value type. <a href="#n1">[1]</a></td>
    </tr>

    <tr>
      <td valign="top">Const reference type</td>

      <td valign="top"><tt>X::const_reference</tt></td>

      <td valign="top">A type that behaves like a const reference to the
      Collection's value type.</td>
    </tr>

    <tr>
      <td valign="top">Pointer type</td>

      <td valign="top"><tt>X::pointer</tt></td>

      <td valign="top">A type that behaves as a pointer to the Collection's
      value type.</td>
    </tr>

    <tr>
      <td valign="top">Distance type</td>

      <td valign="top"><tt>X::difference_type</tt></td>

      <td valign="top">A signed integral type used to represent the distance
      between two of the Collection's iterators. This type must be the same
      as the iterator's distance type.</td>
    </tr>

    <tr>
      <td valign="top">Size type</td>

      <td valign="top"><tt>X::size_type</tt></td>

      <td valign="top">An unsigned integral type that can represent any
      nonnegative value of the Collection's distance type.</td>
    </tr>
  </table>

  <h3>Notation</h3>

  <table summary="">
    <tr>
      <td valign="top"><tt>X</tt></td>

      <td valign="top">A type that is a model of Collection.</td>
    </tr>

    <tr>
      <td valign="top"><tt>a</tt>, <tt>b</tt></td>

      <td valign="top">Object of type <tt>X</tt>.</td>
    </tr>

    <tr>
      <td valign="top"><tt>T</tt></td>

      <td valign="top">The value type of <tt>X</tt>.</td>
    </tr>
  </table>

  <h3>Valid expressions</h3>

  <p>The following expressions must be valid.</p>

  <table border summary="">
    <tr>
      <th>Name</th>

      <th>Expression</th>

      <th>Return type</th>
    </tr>

    <tr>
      <td valign="top">Beginning of range</td>

      <td valign="top"><tt>a.begin()</tt></td>

      <td valign="top"><tt>iterator</tt> if <tt>a</tt> is mutable,
      <tt>const_iterator</tt> otherwise</td>
    </tr>

    <tr>
      <td valign="top">End of range</td>

      <td valign="top"><tt>a.end()</tt></td>

      <td valign="top"><tt>iterator</tt> if <tt>a</tt> is mutable,
      <tt>const_iterator</tt> otherwise</td>
    </tr>

    <tr>
      <td valign="top">Size</td>

      <td valign="top"><tt>a.size()</tt></td>

      <td valign="top"><tt>size_type</tt></td>
    </tr><!--
<TR>
<TD VAlign=top>
Maximum size
</TD>
<TD VAlign=top>
<tt>a.max_size()</tt>
</TD>
<TD VAlign=top>
<tt>size_type</tt>
</TD>
</TR>
-->

    <tr>
      <td valign="top">Empty Collection</td>

      <td valign="top"><tt>a.empty()</tt></td>

      <td valign="top">Convertible to <tt>bool</tt></td>
    </tr>

    <tr>
      <td valign="top">Swap</td>

      <td valign="top"><tt>a.swap(b)</tt></td>

      <td valign="top"><tt>void</tt></td>
    </tr>
  </table>

  <h3>Expression semantics</h3>

  <table border summary="">
    <tr>
      <th>Name</th>

      <th>Expression</th>

      <th>Semantics</th>

      <th>Postcondition</th>
    </tr>

    <tr>
      <td valign="top">Beginning of range</td>

      <td valign="top"><tt>a.begin()</tt></td>

      <td valign="top">Returns an iterator pointing to the first element in
      the Collection.</td>

      <td valign="top"><tt>a.begin()</tt> is either dereferenceable or
      past-the-end. It is past-the-end if and only if <tt>a.size() ==
      0</tt>.</td>
    </tr>

    <tr>
      <td valign="top">End of range</td>

      <td valign="top"><tt>a.end()</tt></td>

      <td valign="top">Returns an iterator pointing one past the last element
      in the Collection.</td>

      <td valign="top"><tt>a.end()</tt> is past-the-end.</td>
    </tr>

    <tr>
      <td valign="top">Size</td>

      <td valign="top"><tt>a.size()</tt></td>

      <td valign="top">Returns the size of the Collection, that is, its
      number of elements.</td>

      <td valign="top"><tt>a.size() &gt;= 0</tt></td>
    </tr><!--
<TR>
<TD VAlign=top>
Maximum size
</TD>
<TD VAlign=top>
<tt>a.max_size()</tt>
</TD>
<TD VAlign=top>
&nbsp;
</TD>
<TD VAlign=top>
Returns the largest size that this Collection can ever have. <A href="#8">[8]</A>
</TD>
<TD VAlign=top>
<tt>a.max_size() &gt;= 0 &amp;&amp; a.max_size() &gt;= a.size()</tt>
</TD>
</TR>
 -->

    <tr>
      <td valign="top">Empty Collection</td>

      <td valign="top"><tt>a.empty()</tt></td>

      <td valign="top">Equivalent to <tt>a.size() == 0</tt>. (But possibly
      faster.)</td>

      <td valign="top">&nbsp;</td>
    </tr>

    <tr>
      <td valign="top">Swap</td>

      <td valign="top"><tt>a.swap(b)</tt></td>

      <td valign="top">Equivalent to <tt>swap(a,b)</tt></td>

      <td valign="top">&nbsp;</td>
    </tr>
  </table>

  <h3>Complexity guarantees</h3>

  <p><tt>begin()</tt> and <tt>end()</tt> are amortized constant time.</p>

  <p><tt>size()</tt> is at most linear in the Collection's size.
  <tt>empty()</tt> is amortized constant time.</p>

  <p><tt>swap()</tt> is at most linear in the size of the two
  collections.</p>

  <h3>Invariants</h3>

  <table border summary="">
    <tr>
      <td valign="top">Valid range</td>

      <td valign="top">For any Collection <tt>a</tt>, <tt>[a.begin(),
      a.end())</tt> is a valid range.</td>
    </tr>

    <tr>
      <td valign="top">Range size</td>

      <td valign="top"><tt>a.size()</tt> is equal to the distance from
      <tt>a.begin()</tt> to <tt>a.end()</tt>.</td>
    </tr>

    <tr>
      <td valign="top">Completeness</td>

      <td valign="top">An algorithm that iterates through the range
      <tt>[a.begin(), a.end())</tt> will pass through every element of
      <tt>a</tt>.</td>
    </tr>
  </table>

  <h3>Models</h3>

  <ul>
    <li><tt>array</tt></li>

    <li><tt>array_ptr</tt></li>

    <li><tt>vector&lt;bool&gt;</tt></li>
  </ul>

  <h3>Collection Refinements</h3>

  <p>There are quite a few concepts that refine the Collection concept,
  similar to the concepts that refine the Container concept. Here is a brief
  overview of the refining concepts.</p>

  <h4>ForwardCollection</h4>

  <p>The elements are arranged in some order that does not change
  spontaneously from one iteration to the next. As a result, a
  ForwardCollection is <a href=
  "http://www.sgi.com/tech/stl/EqualityComparable.html">EqualityComparable</a>
  and <a href=
  "http://www.sgi.com/tech/stl/LessThanComparable.html">LessThanComparable</a>.
  In addition, the iterator type of a ForwardCollection is a
  MultiPassInputIterator which is just an InputIterator with the added
  requirements that the iterator can be used to make multiple passes through
  a range, and that if <tt>it1 == it2</tt> and <tt>it1</tt> is
  dereferenceable then <tt>++it1 == ++it2</tt>. The ForwardCollection also
  has a <tt>front()</tt> method.</p>

  <table border summary="">
    <tr>
      <th>Name</th>

      <th>Expression</th>

      <th>Return type</th>

      <th>Semantics</th>
    </tr>

    <tr>
      <td valign="top">Front</td>

      <td valign="top"><tt>a.front()</tt></td>

      <td valign="top"><tt>reference</tt> if <tt>a</tt> is mutable,<br>
      <tt>const_reference</tt> otherwise.</td>

      <td valign="top">Equivalent to <tt>*(a.begin())</tt>.</td>
    </tr>
  </table>

  <h4>ReversibleCollection</h4>

  <p>The container provides access to iterators that traverse in both
  directions (forward and reverse). The iterator type must meet all of the
  requirements of <a href=
  "http://www.sgi.com/tech/stl/BidirectionalIterator.html">BidirectionalIterator</a>
  except that the reference type does not have to be a real C++ reference.
  The ReversibleCollection adds the following requirements to those of
  ForwardCollection.</p>

  <table border summary="">
    <tr>
      <th>Name</th>

      <th>Expression</th>

      <th>Return type</th>

      <th>Semantics</th>
    </tr>

    <tr>
      <td valign="top">Beginning of range</td>

      <td valign="top"><tt>a.rbegin()</tt></td>

      <td valign="top"><tt>reverse_iterator</tt> if <tt>a</tt> is mutable,
      <tt>const_reverse_iterator</tt> otherwise.</td>

      <td valign="top">Equivalent to
      <tt>X::reverse_iterator(a.end())</tt>.</td>
    </tr>

    <tr>
      <td valign="top">End of range</td>

      <td valign="top"><tt>a.rend()</tt></td>

      <td valign="top"><tt>reverse_iterator</tt> if <tt>a</tt> is mutable,
      <tt>const_reverse_iterator</tt> otherwise.</td>

      <td valign="top">Equivalent to
      <tt>X::reverse_iterator(a.begin())</tt>.</td>
    </tr>

    <tr>
      <td valign="top">Back</td>

      <td valign="top"><tt>a.back()</tt></td>

      <td valign="top"><tt>reference</tt> if <tt>a</tt> is mutable,<br>
      <tt>const_reference</tt> otherwise.</td>

      <td valign="top">Equivalent to <tt>*(--a.end())</tt>.</td>
    </tr>
  </table>

  <h4>SequentialCollection</h4>

  <p>The elements are arranged in a strict linear order. No extra methods are
  required.</p>

  <h4>RandomAccessCollection</h4>

  <p>The iterators of a RandomAccessCollection satisfy all of the
  requirements of <a href=
  "http://www.sgi.com/tech/stl/RandomAccessIterator.html">RandomAccessIterator</a>
  except that the reference type does not have to be a real C++ reference. In
  addition, a RandomAccessCollection provides an element access operator.</p>

  <table border summary="">
    <tr>
      <th>Name</th>

      <th>Expression</th>

      <th>Return type</th>

      <th>Semantics</th>
    </tr>

    <tr>
      <td valign="top">Element Access</td>

      <td valign="top"><tt>a[n]</tt></td>

      <td valign="top"><tt>reference</tt> if <tt>a</tt> is mutable,
      <tt>const_reference</tt> otherwise.</td>

      <td valign="top">Returns the nth element of the Collection. <tt>n</tt>
      must be convertible to <tt>size_type</tt>. Precondition: <tt>0 &lt;= n
      &lt; a.size()</tt>.</td>
    </tr>
  </table>

  <h3>Notes</h3>

  <p><a name="n1" id="n1">[1]</a> The reference type does not have to be a
  real C++ reference. The requirements of the reference type depend on the
  context within which the Collection is being used. Specifically it depends
  on the requirements the context places on the value type of the Collection.
  The reference type of the Collection must meet the same requirements as the
  value type. In addition, the reference objects must be equivalent to the
  value type objects in the collection (which is trivially true if they are
  the same object). Also, in a mutable Collection, an assignment to the
  reference object must result in an assignment to the object in the
  Collection (again, which is trivially true if they are the same object, but
  non-trivial if the reference type is a proxy class).</p>

  <h3>See also</h3>

  <p><a href=
  "http://www.sgi.com/tech/stl/Container.html">Container</a><br></p>
  <hr>

  <p><a href="http://validator.w3.org/check?uri=referer"><img border="0" src=
  "../../doc/images/valid-html401.png" alt="Valid HTML 4.01 Transitional"
  height="31" width="88"></a></p>

  <p>Revised 
  <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->05
  December, 2006<!--webbot bot="Timestamp" endspan i-checksum="38516" --></p>

  <table summary="">
    <tr valign="top">
      <td nowrap><i>Copyright &copy; 2000</i></td>

      <td><i><a href="http://www.boost.org/people/jeremy_siek.htm">Jeremy
      Siek</a>, Univ.of Notre Dame and C++ Library &amp; Compiler Group/SGI
      (<a href="mailto:jsiek@engr.sgi.com">jsiek@engr.sgi.com</a>)</i></td>
    </tr>
  </table>

  <p><i>Distributed under the Boost Software License, Version 1.0. (See
  accompanying file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or
  copy at <a href=
  "http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>)</i></p>
</body>
</html>