std::next
来自 cppreference.cn
< cpp | 迭代器 (iterator)
定义于头文件 <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 |
(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++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
LWG 2353 | C++11 | next 要求 LegacyForwardIterator |
允许 LegacyInputIterator |
[编辑] 参阅
(C++11) |
递减迭代器 (函数模板) |
按给定距离前进迭代器 (函数模板) | |
返回两个迭代器间的距离 (函数模板) | |
(C++20) |
按给定距离或到边界递增迭代器 (算法函数对象) |