最終更新日時(UTC): 2025年07月08日 15時33分39秒
Akira Takahashi が更新

履歴 編集

function template
<iterator>

# std::prev(C++11)

    namespace std {
      template <class BidirectionalIterator>
      BidirectionalIterator prev(BidirectionalIterator x,
                                 typename std::iterator_traits<BidirectionalIterator>::difference_type n = 1); // C++11

      template <class BidirectionalIterator>
      constexpr BidirectionalIterator prev(BidirectionalIterator x,
                                 typename std::iterator_traits<BidirectionalIterator>::difference_type n = 1); // C++17
    }

## 概要

`n`回後方に進めたイテレータを返す。

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

## 効果

    advance(x, -n);
    return x;

## 戻り値

引数として渡されたイテレータを`n`回後方に進めたイテレータのコピー

## 例

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

    int main()
    {
      std::vector<int> v = {3, 1, 4, 5, 2};

      {
        decltype(v)::iterator it = std::prev(v.end()); // イテレータを1回逆に進める
        std::cout << *it << std::endl;
      }
      {
        decltype(v)::iterator it = std::prev(v.end(), 2); // イテレータを2回逆に進める
        std::cout << *it << std::endl;
      }
    }

### 出力

    2
    5

## バージョン

### 言語

- C++11

### 処理系

- Clang: 3.0 ✅
- GCC: 4.4 ✅
- ICC: ??
- Visual C++: ??

## 関連項目

名前 | 説明
--- | ---
`next()` | `n`回前方に進めたイテレータを返す
`advance()` | `n`回イテレータを進める

## 参照

- boost::prior() - Boost Utility Library
- N2246 2 of the least crazy ideas for the standard library in C++0x
- LWG Issue 2353. `std::next` is over-constrained
- P0031R0 A Proposal to Add Constexpr Modifiers to `reverse_iterator`, `move_iterator`, `array` and Range Access