| | |
Call signature | | |
| (1) | (since C++20) |
| (2) | (since C++20) |
| (3) | (since C++20) |
| | |
Return thenth predecessor of iteratori.
The function-like entities described on this page arealgorithm function objects (informally known asniebloids), that is:
[edit]Parameters
i | - | an iterator |
n | - | number of elementsi should be descended |
bound | - | iterator denoting the beginning of the rangei points to |
[edit]Return value
1) The predecessor ofi.
2) Thenth predecessor of iteratori.
3) Thenth predecessor of iteratori, or the first iterator that compares equal tobound, whichever is first.
[edit]Complexity
1) Constant.
[edit]Possible implementation
Although the expression--r.end() often compiles for containers, it is not guaranteed to do so:r.end() is an rvalue expression, and there is no iterator requirement that specifies that decrement of an rvalue is guaranteed to work. In particular, when iterators are implemented as pointers or itsoperator--
is lvalue-ref-qualified,--r.end() does not compile, whileranges::prev(r.end()) does.
This is further exacerbated by ranges that do not modelranges::common_range. For example, for some underlying ranges,ranges::transform_view::end doesn't have the same return type asranges::transform_view::begin, and so--r.end() won't compile. This isn't something thatranges::prev
can aid with, but there are workarounds.
[edit]Example
#include <iostream>#include <iterator>#include <vector> int main(){std::vector<int> v{3,1,4};auto pv= std::ranges::prev(v.end(),2);std::cout<<*pv<<'\n'; pv= std::ranges::prev(pv,42, v.begin());std::cout<<*pv<<'\n';}
Output:
[edit]See also
| increment an iterator by a given distance or to a bound (algorithm function object)[edit] |
| advances an iterator by given distance or to a given bound (algorithm function object)[edit] |
| decrement an iterator (function template)[edit] |