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

履歴 編集

function template
<iterator>

# std::ranges::prev(C++20)

    namespace std::ranges {
      template<bidirectional_iterator I>
      constexpr I prev(I x);                                    // (1)

      template<bidirectional_iterator I>
      constexpr I prev(I x, iter_difference_t<I> n);            // (2)

      template<bidirectional_iterator I>
      constexpr I prev(I x, iter_difference_t<I> n, I bound);   // (3)
    }

## 概要

`n`回あるいは指定された位置まで戻したイテレータを返す。

`ranges::advance()`と違い、引数として渡されたイテレータへの参照を書き換えるのではなく、`n`回戻したイテレータのコピーを返す。

## 引数

- `x` -- 進行の出発位置を示すイテレータ
- `n` -- 進める距離
- `bound` -- 進行の目的地となる位置を示すイテレータ（あるいは番兵）

## 効果

- (1) : 以下と等価

      --x;
      return x;

- (2) : 以下と等価

      ranges::advance(x, -n);
      return x;

- (3) : 以下と等価

      ranges::advance(x, -n, bound);
      return x;

## 戻り値

- (1) : `x`を1戻したイテレータのコピーを返す
- (2) : `x`を`n`戻したイテレータのコピーを返す
- (3) : `x`を`bound`以内で`n`戻したイテレータのコピーを返す

## 備考

この関数テンプレートは通常の名前探索で発見されている場合にADLを無効化する。詳しくは「ADLを無効にする関数定義」を参照のこと。

## 例

    #include <iostream>
    #include <iterator>
    #include <vector>

    int main() {
      std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

      auto it = std::end(vec);

      // (1)、1つ戻る
      auto pos10 = std::ranges::prev(it);
      std::cout << *pos10 << std::endl;

      // (2)、3戻る
      auto pos8 = std::ranges::prev(it, 3);
      std::cout << *pos8 << std::endl;

      // (2)、-2進める
      auto pos10_2 = std::ranges::prev(pos8, -2);
      std::cout << *pos10_2 << std::endl;

      auto bound = std::ranges::prev(it, 5); // 6の位置

      // (3)、boundまでの間で、8戻る
      auto pos6 = std::ranges::prev(it, 8, bound);
      std::cout << *pos6 << std::endl;

      // (3)、boundまでの間で、4戻る
      auto pos7 = std::ranges::prev(it, 4, bound);
      std::cout << *pos7 << std::endl;
    }

### 出力

    10
    8
    10
    6
    7

## バージョン

### 言語

- C++20

### 処理系

- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 5 ✅

## 関連項目

名前 | 説明
--- | ---
`next()` | `n`回前方に進めたイテレータを返す
`prev()` | `n`回後方に進めたイテレータを返す
`advance()` | `n`回イテレータを進める
`ranges::next()` | `n`回あるいは`bound`まで前方に進めたイテレータを返す
`ranges::advance()` | `n`回あるいは`bound`までイテレータを進める

## 参照

- P0896R4 The One Ranges Proposal (was Merging the Ranges TS)