[ Web Proxy ]
URL:
Viewing: https://en.cppreference.com/cpp/iterator/next [Back]  [Original]

std::next - cppreference.com
cppreference.com
Namespaces
Variants

std::next

From cppreference.com
 
 
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
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

increment an iterator by a given distance or to a bound
(algorithm function object)[edit]
(C++11)
decrement an iterator
(function template) [edit]
advances an iterator by given distance
(function template) [edit]
returns the distance between two iterators
(function template) [edit]

Web Proxy Viewer  |  New URL  |  Original Page