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 ただし、 Iterator がrandom_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