| | |
Call signature | | |
| (1) | (since C++20) |
| (2) | (since C++20) |
| (3) | (since C++20) |
| (4) | (since C++20) |
| | |
Return thenth successor 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 elements to advance |
bound | - | sentinel denoting the end of the rangei points to |
[edit]Return value
1) The successor of iteratori.
2) Thenth successor of iteratori.
3) The first iterator equivalent tobound.
4) Thenth successor of iteratori, or the first iterator equivalent tobound, whichever is first.
[edit]Complexity
1) Constant.
[edit]Possible implementation
struct next_fn{template<std::input_or_output_iterator I>constexpr I operator()(I i)const{++i;return i;} template<std::input_or_output_iterator I>constexpr I operator()(I i,std::iter_difference_t<I> n)const{ranges::advance(i, n);return i;} template<std::input_or_output_iterator I,std::sentinel_for<I> S>constexpr I operator()(I i, S bound)const{ranges::advance(i, bound);return i;} template<std::input_or_output_iterator I,std::sentinel_for<I> S>constexpr I operator()(I i,std::iter_difference_t<I> n, S bound)const{ranges::advance(i, n, bound);return i;}}; inlineconstexprauto next= next_fn(); |
Although the expression++x.begin() often compiles, it is not guaranteed to do so:x.begin() is an rvalue expression, and there is no requirement that specifies that increment of an rvalue is guaranteed to work. In particular, when iterators are implemented as pointers or itsoperator++
is lvalue-ref-qualified,++x.begin() does not compile, whileranges::next(x.begin()) does.
[edit]Example
#include <cassert>#include <iterator> int main(){auto v={3,1,4};{auto n= std::ranges::next(v.begin());assert(*n==1);}{auto n= std::ranges::next(v.begin(),2);assert(*n==4);}{auto n= std::ranges::next(v.begin(), v.end());assert(n== v.end());}{auto n= std::ranges::next(v.begin(),42, v.end());assert(n== v.end());}}
[edit]See also
| decrement 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] |
| increment an iterator (function template)[edit] |