Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/iterator/next"

From cppreference.com
< cpp‎ | iterator
m (Possible implementation)
m
Line 17: Line 17:
 
{{dcl end}}
 
{{dcl end}}
  
Return the {{tt|n}}th successor of iterator {{tt|it}}.
+
Return the {{tt|''n''}}th successor of iterator {{tt|it}}.
  
 
===Parameters===
 
===Parameters===
Line 28: Line 28:
  
 
===Return value===
 
===Return value===
The {{tt|n}}th successor of iterator {{tt|it}}.
+
The {{tt|''n''}}th successor of iterator {{tt|it}}.
  
 
===Complexity===
 
===Complexity===

Revision as of 18:33, 11 July 2020

 
 
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 it,

  typename std::iterator_traits<InputIt>::difference_type n = 1 );
(since C++11)
(until C++17)
template< class InputIt >

constexpr InputIt next(
  InputIt it,

  typename std::iterator_traits<InputIt>::difference_type n = 1 );
(since C++17)

Return the nth successor of iterator it.

Contents

Parameters

it - an iterator
n - number of elements to advance
Type requirements
-
InputIt must meet the requirements of LegacyInputIterator.

Return value

The nth successor of iterator it.

Complexity

Linear.

However, if InputIt additionally meets the requirements of LegacyRandomAccessIterator, complexity is constant.

Possible implementation

template<class InputIt>
constexpr // since C++17
InputIt next(InputIt it,
             typename std::iterator_traits<InputIt>::difference_type n = 1)
{
    std::advance(it, n);
    return it;
}

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{ 3, 1, 4 };
 
    auto it = v.begin();
 
    auto nx = std::next(it, 2);
 
    std::cout << *it << ' ' << *nx << '\n';
}

Output:

3 4

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 next required LegacyForwardIterator LegacyInputIterator allowed

See also

(C++11)
decrement an iterator
(function template) [edit]
advances an iterator by given distance
(function template) [edit]