constexpr subrange& advance(iter_difference_t<I> n);
概要
部分Rangeの先頭を前進または後退させる。引数が負の時は後退する。
効果
StoreSize
が真のとき、
auto d = n - ranges::advance(begin_, n, end_);
if (d >= 0)
size_ -= to-unsigned-like(d);
else
size_ += to-unsigned-like(-d);
return *this;
それ以外のとき、
ranges::advance(begin_, n, end_);
return *this;
備考
subrange
の末端を超えて進めようとした場合、subrange
の長さは0になる。subrange
の先頭を後退させたとき、元の範囲でその位置に要素があればアクセスできる。
例
#include <ranges>
#include <iostream>
template<std::ranges::range R>
void print(const R& r) {
for (int x : r) {
std::cout << x << ',';
}
std::cout << '\n';
}
int main()
{
constexpr int a[] = {1, 2, 3, 4, 5};
std::ranges::subrange sub(a + 1, a + 4);
print(sub);
sub.advance(1);
print(sub);
sub.advance(1);
print(sub);
sub.advance(-3);
print(sub);
// これ以上後退すると、先頭が配列aの範囲を超えてしまう
// sub.advance(-1);
// print(sub);
}
出力
2,3,4,
3,4,
4,
1,2,3,4,
バージョン
言語
- C++20
処理系
- Clang: 13.0.0 ✅
- GCC: 10.1.0 ✅
- ICC: ?
- Visual C++: 2019 Update 10 ✅