std:: next
|
定义于头文件
<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 // 自 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)
|
按给定距离或边界递增迭代器
(算法函数对象) |