std::ranges::next
来自cppreference.com
| 在标头 <iterator> 定义
|
||
| 调用签名 |
||
| |
(1) | (C++20 起) |
| |
(2) | (C++20 起) |
| |
(3) | (C++20 起) |
| |
(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> 则为常数;否则为线性。4) 若
I 与 S 实现 std::random_access_iterator<I> 和 std::sized_sentinel_for<S, I> 则为常数;否则为线性。可能的实现
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) |
自减迭代器给定的距离或到边界 (算法函数对象) |
(C++20) |
令迭代器前进给定的距离或到给定的边界 (算法函数对象) |
(C++11) |
令迭代器自增 (函数模板) |