最終更新日時(UTC):
が更新

履歴 編集

class template
<iterator>

std::reverse_iterator

namespace std {
  template <class Iterator>
  class reverse_iterator
    : public iterator<typename iterator_traits<Iterator>::iterator_category,
                      typename iterator_traits<Iterator>::value_type,
                      typename iterator_traits<Iterator>::difference_type,
                      typename iterator_traits<Iterator>::pointer,
                      typename iterator_traits<Iterator>::reference>;

  // 距離を求められないイテレータペアについて、sized_sentinel_forを無効化する(C++20)
  template<class Iterator1, class Iterator2>
    requires (!sized_sentinel_for<Iterator1, Iterator2>)
  inline constexpr bool disable_sized_sentinel_for<reverse_iterator<Iterator1>,
                                                   reverse_iterator<Iterator2>> = true;
}

概要

reverse_iteratorは、イテレータを、逆方向に進むイテレータとしてラップするイテレータアダプタである。

endイテレータをreverse_iteratorでラップした場合、end - 1 (つまり終端要素)を指し、begin - 1のイテレータを終端値としてみなす。

要件

  • C++17まで : テンプレートパラメータIteratorは、双方向イテレータの要件を満たすこと。ランダムアクセスイテレータであることを必要とする横断操作を使用する場合は、ランダムアクセスイテレータの要件を満たすこと。
  • C++20 : テンプレートパラメータIteratorは、bidirectional_iteratorのモデルとなること。ランダムアクセスイテレータであることを必要とする横断操作を使用する場合は、random_access_iteratorのモデルとなること。

メンバ関数

名前 説明 対応バージョン
(constructor) コンストラクタ
~reverse_iterator() = default デストラクタ
operator= 代入演算子
base 元となったイテレータを取得する
operator* 間接参照演算子
operator-> メンバアクセス演算子
operator++ イテレータをインクリメントする
operator-- イテレータをデクリメントする
operator+ イテレータを進める
operator+= イテレータ自身を進める
operator- イテレータを逆に進める
operator-= イテレータ自身を逆に進める
operator[] 任意の位置にランダムアクセスする

protectedメンバ変数

変数名 対応バージョン
current Iterator

メンバ型

C++17まで

名前 説明 対応バージョン
iterator_type Iterator
difference_type iterator_traits<Iterator>::difference_type
pointer iterator_traits<Iterator>::pointer
value_type iterator_traits<Iterator>::value_type
iterator_category iterator_traits<Iterator>::iterator_category
reference iterator_traits<Iterator>::reference

C++20

名前 説明 対応バージョン
iterator_type Iterator
difference_type iter_difference_t<Iterator> C++20
pointer Iterator
value_type iter_value_t<Iterator> C++20
iterator_category iterator_traits<Iterator>::iterator_category
ただし、contiguous_iterator_tagとなるときはrandom_access_iterator_tag
C++20
iterator_concept bidirectional_iterator_tag
ただし、Iteratorrandom_access_iteratorのモデルとなるときはrandom_access_iterator_tag
C++20
reference iter_reference_t<Iterator> C++20

非メンバ関数

名前 説明 対応バージョン
operator== 等値比較
operator!= 非等値比較
operator< 左辺が右辺より小さいかの判定を行う
operator<= 左辺が右辺以下かの判定を行う
operator> 左辺が右辺より大きいかの判定を行う
operator>= 左辺が右辺以上かの判定を行う
operator<=> 三方比較を行う C++20
operator- 2つのreverse_iteratorの差を求める
operator+ イテレータを進める
iter_move イテレータの要素の移動 C++20
iter_swap イテレータの要素の交換 C++20

ヘルパ関数

名前 説明 対応バージョン
make_reverse_iterator reverse_iteratorオブジェクトを作るヘルパ関数 C++14

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

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

  // 逆順に走査する
  std::reverse_iterator<decltype(v)::iterator> first(v.end());
  std::reverse_iterator<decltype(v)::iterator> last(v.begin());

  std::for_each(first, last, [](int x) {
    std::cout << x << std::endl;
  });
}

出力

5
4
3
2
1

参照