std::ranges::subrange<I,S,K>::advance
来自cppreference.com
constexpr subrange& advance( std::iter_difference_t<I> n ); |
(C++20 起) | |
若 n >= 0
,则自增 n
次存储的迭代器,或直至它等于存储的哨位,二者之一先到来为止。否则,自减存储的迭代器 -n
次。
存储的大小若存在,则相应地得到调整(若 n < 0
则增加 -n
,否则减少 m
,其中 m
是实际应用到迭代器的自增次数)。
若
-
I
不实现bidirectional_iterator
且n < 0
,或 - 存储的迭代器在变为不可自减值后被自减,
则行为未定义。
参数
n | - | 迭代器上的最大自增次数 |
返回值
*this
复杂度
通常为在 n >= 0
或 n < 0
时分别为迭代器上的 min(n, size())
次自增或 -n
次自减。
若 I
实现 random_access_iterator
,且 n < 0
或者 std::sized_sentinel_for<S, I> 得到实现则为常数。
注解
存储的大小当且仅当 K == ranges::subrange_kind::sized 但 std::sized_sentinel_for<S, I> 不被满足才存在。
示例
运行此代码
#include <algorithm> #include <array> #include <iostream> #include <iterator> #include <ranges> void print(auto name, auto const sub) { std::cout << name << ".size() == " << sub.size() << "; { "; std::ranges::for_each(sub, [](int x) { std::cout << x << ' '; }); std::cout << "}\n"; }; int main() { std::array arr{1,2,3,4,5,6,7}; std::ranges::subrange sub{ std::next(arr.begin()), std::prev(arr.end()) }; print("1) sub", sub); print("2) sub", sub.advance(3)); print("3) sub", sub.advance(-2)); }
输出:
1) sub.size() == 5; { 2 3 4 5 6 } 2) sub.size() == 2; { 5 6 } 3) sub.size() == 4; { 3 4 5 6 }
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 3433 | C++20 | 规范错误处理了 n < 0 的情况
|
已更正 |
参阅
(C++20) |
以给定距离前进迭代器并返回原 subrange (公开成员函数) |
(C++20) |
以给定距离减少迭代器并返回原 subrange (公开成员函数) |
令迭代器前进给定的距离 (函数模板) | |
(C++20) |
令迭代器前进给定的距离或到给定的边界 (niebloid) |