Namespaces
Variants

std:: next

From cppreference.net
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)
定义于头文件 <iterator>
template < class InputIt >
InputIt next ( InputIt it, typename std:: iterator_traits < InputIt > :: difference_type n = 1 ) ;
(C++11 起)
(C++17 前)
template < class InputIt >

constexpr

InputIt next ( InputIt it, typename std:: iterator_traits < InputIt > :: difference_type n = 1 ) ;
(C++17 起)

返回迭代器 it 的第 n 个后继(若 n 为负值则返回第 - n 个前驱)。

目录

参数

it - 迭代器
n - 要前移的元素数量
类型要求
-
InputIt 必须满足 LegacyInputIterator 的要求。

返回值

一个类型为 InputIt 的迭代器,它持有迭代器 it 的第 n 后继(若 n 为负值,则为第 - n 前驱)。

复杂度

线性。

然而,若 InputIt 额外满足 LegacyRandomAccessIterator 的要求,则复杂度为常数级。

可能的实现

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

注释

尽管表达式 ++ c. begin ( ) 通常能够编译通过,但这并非绝对保证: c. begin ( ) 是一个右值表达式,而 LegacyInputIterator 要求中并未规定对右值进行递增操作必须保证有效。特别是当迭代器以指针形式实现或其 operator++ 具有左值引用限定时, ++ c. begin ( ) 将无法编译,而 std :: next ( c. begin ( ) ) 则可以正常编译。

示例

#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';
}

输出:

4 6
 5

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 适用范围 发布时行为 正确行为
LWG 2353 C++11 next 要求 LegacyForwardIterator 允许 LegacyInputIterator

参见

(C++11)
递减迭代器
(函数模板)
按给定距离推进迭代器
(函数模板)
返回两个迭代器间的距离
(函数模板)
按给定距离或边界递增迭代器
(算法函数对象)