std:: reverse_iterator
|
ヘッダーで定義
<iterator>
|
||
|
template
<
class
Iter
>
class reverse_iterator ; |
||
std::reverse_iterator
は、与えられたイテレータ(少なくとも
LegacyBidirectionalIterator
または
bidirectional_iterator
をモデルとする
(C++20以降)
である必要があります)の方向を逆転させるイテレータアダプタです。言い換えると、双方向イテレータが与えられた場合、
std::reverse_iterator
は、基盤となる双方向イテレータによって定義されるシーケンスの終端から先頭へ移動する新しいイテレータを生成します。
逆イテレータ r がイテレータ i から構築される場合、関係式 & * r == & * ( i - 1 ) は常に true となる( r が デリファレンス可能 である限り)。したがって、終端次要素イテレータから構築された逆イテレータはシーケンスの最後の要素を指す。
これは、
標準ライブラリコンテナ
のメンバー関数
rbegin()
および
rend()
によって返されるイテレータです。
目次 |
ネストされた型
|
(C++20まで) | ||||||||||||||||
|
(C++20以降) |
- ↑ 1.0 1.1 この定義はC++17まで基底クラス std::iterator の特殊化によって提供されます。
データメンバ
| メンバー | 説明 |
Iter
current
|
基盤となるイテレータ
(protected member object) |
メンバー関数
新しい
reverse_iterator
を構築する
(public member function) |
|
別の
reverse_iterator
を代入する
(public member function) |
|
|
基盤となるイテレータにアクセスする
(public member function) |
|
|
指し示す要素にアクセスする
(public member function) |
|
|
インデックスによる要素へのアクセス
(public member function) |
|
reverse_iterator
を進めるまたは戻す
(public member function) |
非メンバー関数
|
基底となるイテレータを比較する
(関数テンプレート) |
|
|
イテレータを進める
(関数テンプレート) |
|
|
2つのイテレータアダプタ間の距離を計算する
(関数テンプレート) |
|
|
(C++20)
|
調整された基底イテレータの間接参照結果を、関連する右辺値参照型にキャストする
(関数) |
|
(C++20)
|
2つの調整された基底イテレータが指すオブジェクトを交換する
(関数テンプレート) |
|
(C++14)
|
引数から型が推論される
std::reverse_iterator
を作成する
(関数テンプレート) |
ヘルパーテンプレート
|
template
<
class
Iterator1,
class
Iterator2
>
requires
(
!
std::
sized_sentinel_for
<
Iterator1, Iterator2
>
)
|
(C++20以降) | |
std::disable_sized_sentinel_for
のこの部分特殊化は、
基盤となるイテレータがコンセプトを満たさない場合に、
reverse_iterator
の特殊化が
sized_sentinel_for
を満たすことを防止します。
実装例
以下は、内部イテレータの格納方法に焦点を当てた部分的な実装です。 std::prev は、 operator * を介してコンテンツが取得される場合にのみ呼び出されます。
template<class It> class reverse_iterator { protected: It current = It(); public: reverse_iterator() = default; constexpr explicit reverse_iterator(It itr) : current(itr) {} template<class U> requires (!std::is_same_v<U, It> && std::convertible_to<const U&, It>) constexpr explicit reverse_iterator(const U& other) : current(other.base()) {} constexpr decltype(auto) operator*() const { return *std::prev(current); // <== prevの内容を返す } constexpr reverse_iterator& operator++() { --current; return *this; } constexpr reverse_iterator operator++(int) { auto tmp = *this; ++(*this); return tmp; } constexpr reverse_iterator& operator--() { ++current; return *this; } constexpr reverse_iterator operator--(int) { auto tmp = *this; --(*this); return tmp; } constexpr It base() const { return current; } // 他のメンバ関数、フレンド関数、メンバ型定義はここでは表示されていません。 }; |
注記
std::reverse_iterator
は、デリファレンスが
*
this
のメンバへの参照を返すイテレータ(いわゆる「スタッシングイテレータ」)では動作しません。スタッシングイテレータの例として、
MSVC STLの
std::filesystem::path::iterator
があります。
例
#include <cstddef> #include <iostream> #include <iterator> template<typename T, std::size_t SIZE> class Stack { T arr[SIZE]; std::size_t pos = 0; public: T pop() { return arr[--pos]; } Stack& push(const T& t) { arr[pos++] = t; return *this; } // Stackのループ処理をLIFO順で行いたいため // 既存のイテレータ(この場合は単純なポインタ: [arr, arr + pos))に対して // std::reverse_iteratorをアダプタとして使用 auto begin() { return std::reverse_iterator(arr + pos); } auto end() { return std::reverse_iterator(arr); } }; int main() { Stack<int, 8> s; s.push(5).push(15).push(25).push(35); for (int val : s) std::cout << val << ' '; std::cout << '\n'; }
出力:
35 25 15 5
関連項目
|
(C++14)
|
引数の型から推論される
std::reverse_iterator
を作成する
(関数テンプレート) |
|
(C++17で非推奨)
|
単純なイテレータに必要な型の定義を容易にする基底クラス
(クラステンプレート) |