std::ranges::subrange<I,S,K>::advance

来自cppreference.com
< cpp‎ | ranges‎ | subrange
 
 
范围库
范围访问
范围转换器
(C++23)
范围原语



悬垂迭代器处理
范围概念
视图

范围工厂
适配器
范围生成器
范围适配器对象
范围适配器闭包对象
辅助项
 
std::ranges::subrange
成员函数
观察器
迭代器操作
subrange::advance
(C++20)
推导指引
非成员函数
(C++20)
辅助类型
(C++20)
 
constexpr subrange& advance( std::iter_difference_t<I> n );
(C++20 起)

n >= 0 ,则自增 n 次存储的迭代器,或直至它等于存储的哨位,二者之一先到来为止。否则,自减存储的迭代器 -n 次。

存储的大小若存在,则相应地得到调整(若 n < 0 则增加 -n ,否则减少 m ,其中 m 是实际应用到迭代器的自增次数)。

  • I 不实现 bidirectional_iteratorn < 0 ,或
  • 存储的迭代器在变为不可自减值后被自减,

则行为未定义。

参数

n - 迭代器上的最大自增次数

返回值

*this

复杂度

通常为在 n >= 0n < 0 时分别为迭代器上的 min(n, size()) 次自增或 -n 次自减。

I 实现 random_access_iterator ,且 n < 0 或者 std::sized_sentinel_for<S, I> 得到实现则为常数。

注解

存储的大小当且仅当 K == ranges::subrange_kind::sizedstd::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
(公开成员函数)
令迭代器前进给定的距离
(函数模板)
令迭代器前进给定的距离或到给定的边界
(niebloid)