File: algorithms.qbk

package info (click to toggle)
boost1.90 1.90.0-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 593,156 kB
  • sloc: cpp: 4,190,642; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,776; makefile: 1,161; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (149 lines) | stat: -rw-r--r-- 5,445 bytes parent folder | download | duplicates (10)
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
[section:algorithms Algorithms]

[section:advance Function template `advance()`]

The `boost::iterators::advance` function template is an adapted version of `std::advance` for the Boost iterator [link iterator.concepts.traversal traversal concepts].

[heading Header]

    <boost/iterator/advance.hpp>

[heading Synopsis]

    template <typename Iterator, typename Distance>
    constexpr void advance(Iterator& it, Distance n);


[heading Description]

Moves `it` forward by `n` increments (or backward by `|n|` decrements if `n` is negative).

[heading Requirements]

`Iterator` should model Incrementable Iterator.

[heading Preconditions]

Let `it`[sub `i`] be the iterator obtained by incrementing (or decrementing if `n` is negative) `it` by `i`. All the iterators `it`[sub `i`] for `i` = 0, 1, 2, ..., `|n|` should be valid.

If `Iterator` does not model [link iterator.concepts.traversal.bidirectional Bidirectional Traversal Iterator], `n` should be non-negative.

[heading Complexity]

If `Iterator` models [link iterator.concepts.traversal.random_access Random Access Traversal Iterator], it takes constant time; otherwise it takes linear time.

[heading Notes]

* This function is not a customization point and is protected against being found by argument-dependent lookup (ADL).
* This function is `constexpr` only in C++14 or later.

[heading Acknowledgements]

Contributed by Michel Morin.

[endsect]

[section:distance Function template `distance()`]

The `boost::iterators::distance` function template is an adapted version of `std::distance` for the Boost iterator [link iterator.concepts.traversal traversal concepts].

[heading Header]

    <boost/iterator/distance.hpp>

[heading Synopsis]

    template <typename Iterator>
    constexpr typename iterator_difference<Iterator>::type
    distance(Iterator first, Iterator last);

[heading Description]

Computes the (signed) distance from `first` to `last`.

[heading Requirements]

`Iterator` should model [link iterator.concepts.traversal.single_pass Single Pass Iterator].

[heading Preconditions]

If `Iterator` models [link iterator.concepts.traversal.random_access Random Access Traversal Iterator], `[first, last)` or `[last, first)` should be valid; otherwise `[first, last)` should be valid.

[heading Complexity]

If `Iterator` models [link iterator.concepts.traversal.random_access Random Access Traversal Iterator], it takes constant time; otherwise it takes linear time.

[heading Notes]

* This function is not a customization point and is protected against being found by argument-dependent lookup (ADL).
* This function is `constexpr` only in C++14 or later.

[heading Acknowledgements]

Contributed by Michel Morin.

[endsect]

[section:next_prior Function templates `next()` and `prior()`]

Certain data types, such as the C++ Standard Library's forward and bidirectional iterators, do not provide addition and subtraction via `operator+()` or `operator-()`. This means that non-modifying computation of the next or prior value requires a temporary, even though `operator++()` or `operator--()` is provided. It also means that writing code like `itr+1` inside a template restricts the iterator category to random access iterators.

The `next()` and `prior()` functions defined in `boost/next_prior.hpp` provide a simple way around these problems.

[heading Synopsis]

    template <class T>
    T next(T x)
    {
        return ++x;
    }

    template <class T, class Distance>
    T next(T x, Distance n)
    {
        std::advance(x, n);
        return x;
    }

    template <class T>
    T prior(T x)
    {
        return --x;
    }

    template <class T, class Distance>
    T prior(T x, Distance n)
    {
        std::advance(x, -n);
        return x;
    }

[note Function implementations above are given for exposition only. The actual implementation has the same effect for iterators, but has different properties, as documented later.]

[heading Usage]

Usage is simple:

    const std::list<T>::iterator p = get_some_iterator();
    const std::list<T>::iterator prev = boost::prior(p);
    const std::list<T>::iterator next = boost::next(prev, 2);

The distance from the given iterator should be supplied as an absolute value. For example, the iterator four iterators prior to the given iterator `p` may be obtained by `prior(p, 4)`.

With C++11, the Standard Library provides `std::next()` and `std::prev()` function templates, which serve the same purpose. However, there are advantages to `boost::next()` and `boost::prior()`.

First, `boost::next()` and `boost::prior()` are compatible not only with iterators but with any type that provides arithmetic operators `operator++()`, `operator--()`, `operator+()`, `operator-()`, `operator+=()` or `operator-=()`. For example, this is possible:

    int x = 10;
    int y = boost::next(x, 5);
    assert(y == 15);

Second, `boost::next()` and `boost::prior()` use [link iterator.concepts.traversal traversal categories] to select the most efficient implementation. For some kinds of iterators, such as [link iterator.specialized.transform transform iterators], the standard iterator category does not reflect the traversal category correctly and therefore `std::next()` and `std::prev()` will fall back to linear complexity.

[heading Acknowledgements]

Contributed by [@http://www.boost.org/people/dave_abrahams.htm Dave Abrahams]. Two-argument versions by Daniel Walker.

[endsect]

[endsect]