std::ranges::next
来自cppreference.com
在标头 <iterator> 定义
|
||
调用签名 |
||
template< std::input_or_output_iterator I > constexpr I next( I i ); |
(1) | (C++20 起) |
template< std::input_or_output_iterator I > constexpr I next( I i, std::iter_difference_t<I> n ); |
(2) | (C++20 起) |
template< std::input_or_output_iterator I, std::sentinel_for<I> S > constexpr I next( I i, S bound ); |
(3) | (C++20 起) |
template< std::input_or_output_iterator I, std::sentinel_for<I> S > constexpr I next( I i, std::iter_difference_t<I> n, S bound ); |
(4) | (C++20 起) |
返回迭代器 i 的第 n 个后继。
此页面上描述的函数式实体是 niebloid,即:
实践中,可以作为函数对象,或者用某些特殊编译器扩展实现它们。
参数
i | - | 迭代器 |
n | - | 要自增的次数 |
bound | - | 哨位,代表 i 所指向的范围的结尾 |
返回值
1) 迭代器 i 的后继
2) 迭代器 i 的第 n 个后继
3) 首个等于 bound 的迭代器
4) 迭代器 i 的第 n 个后继,或首个等于 bound 的迭代器,取决于何者先达成。
复杂度
1) 常数。
2) 若
I
实现 std::random_access_iterator 则为常数;否则为线性。3) 若
I
与 S
实现 std::random_access_iterator<I> 和 std::sized_sentinel_for<S, I>,或 I
与 S
实现 std::assignable_from<I&, S> 则为常数;否则为线性。可能的实现
struct next_fn { template<std::input_or_output_iterator I> constexpr I operator()(I i) const { ++i; return i; } template<std::input_or_output_iterator I> constexpr I operator()(I i, std::iter_difference_t<I> n) const { ranges::advance(i, n); return i; } template<std::input_or_output_iterator I, std::sentinel_for<I> S> constexpr I operator()(I i, S bound) const { ranges::advance(i, bound); return i; } template<std::input_or_output_iterator I, std::sentinel_for<I> S> constexpr I operator()(I i, std::iter_difference_t<I> n, S bound) const { ranges::advance(i, n, bound); return i; } }; inline constexpr auto next = next_fn(); |
注解
尽管表达式 ++x.begin() 经常能编译,但不保证如此:x.begin() 是右值表达式,而没有“指定右值的自增保证能工作”的要求。尤其是迭代器实现为指针或其 operator++
带有左值引用限定时,++x.begin() 不能编译,而 ranges::next(x.begin()) 能。
示例
运行此代码
#include <cassert> #include <iterator> int main() { auto v = {3, 1, 4}; { auto n = std::ranges::next(v.begin()); assert(*n == 1); } { auto n = std::ranges::next(v.begin(), 2); assert(*n == 4); } { auto n = std::ranges::next(v.begin(), v.end()); assert(n == v.end()); } { auto n = std::ranges::next(v.begin(), 42, v.end()); assert(n == v.end()); } }
参阅
(C++20) |
自减迭代器给定的距离或到边界 (niebloid) |
(C++20) |
令迭代器前进给定的距离或到给定的边界 (niebloid) |
(C++11) |
令迭代器自增 (函数模板) |