最終更新日時: 2025年07月09日 00時33分39秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<ranges>

# std::ranges::subrange::advance(C++20)

    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 ✅

## 参照

- N4861 24 Ranges library
- C++20 ranges