命名空间
变体
操作

std::next

来自 cppreference.com
< cpp‎ | iterator
 
 
迭代器库
迭代器概念
迭代器原语
算法概念和实用程序
间接可调用概念
通用算法要求
(C++20)
(C++20)
(C++20)
实用程序
(C++20)
迭代器适配器
迭代器操作
(C++11)  
next
(C++11)
范围访问
(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 // since 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++ 标准。

DR 应用于 发布的行为 正确行为
LWG 2353 C++11 next 需要 LegacyForwardIterator LegacyInputIterator 允许

[编辑] 另请参阅

(C++11)
递减迭代器
(函数模板) [编辑]
将迭代器向前推进给定距离
(函数模板) [编辑]
返回两个迭代器之间的距离
(函数模板) [编辑]
将迭代器向前推进给定距离或到边界
(niebloid)[编辑]