std::next
| Defined in header <iterator>
|
||
template< class InputIt >
InputIt next( InputIt iter, typename std::iterator_traits
<InputIt>::difference_type count = 1 );
|
(since C++11) (constexpr since C++17) |
|
Return the countth successor (or -countth predecessor if count is negative) of iterator iter.
Parameters
| iter | - | an iterator |
| count | - | the number of steps to advance |
| Type requirements | ||
-InputIt must meet the requirements of LegacyInputIterator.
| ||
Return value
As described above.
Complexity
Linear in count.
However, if InputIt additionally meets the requirements of LegacyRandomAccessIterator, complexity is constant.
Possible implementation
template<class InputIt>
constexpr // since C++17
InputIt next(InputIt iter,
typename std::iterator_traits<InputIt>::difference_type count = 1)
{
std::advance(iter, count);
return iter;
}
|
Notes
Although the expression ++c.begin() often compiles, it is not guaranteed to do so: c.begin() is an rvalue expression, and there is no LegacyInputIterator requirement that specifies that increment of an rvalue is guaranteed to work. In particular, when iterators are implemented as pointers or its operator++ is lvalue-ref-qualified, ++c.begin() does not compile, while std::next(c.begin()) does.
Example
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::vector<int> v{4, 5, 6};
auto it = v.begin();
auto nx = std::next(it, 2);
std::cout << *it << ' ' << *nx << '\n';
it = v.end();
nx = std::next(it, -2);
std::cout << ' ' << *nx << '\n';
}
Output:
4 6
5
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2353 | C++11 | std::next could only accept LegacyForwardIterators
|
LegacyInputIterator allowed |
See also
(C++20) |
increment an iterator by a given distance or to a bound (algorithm function object) |
(C++11) |
decrement an iterator (function template) |
| advances an iterator by given distance (function template) | |
| returns the distance between two iterators (function template) |