std::reverse_iterator
| ヘッダ <iterator> で定義
|
||
template< class Iter > class reverse_iterator : public std::iterator< typename std::iterator_traits<Iter>::iterator_category, typename std::iterator_traits<Iter>::value_type, typename std::iterator_traits<Iter>::difference_type, typename std::iterator_traits<Iter>::pointer, typename std::iterator_traits<Iter>::reference > |
(C++17未満) | |
template< class Iter > class reverse_iterator; |
(C++17以上) | |
std::reverse_iterator は指定されたイテレータの方向を反転させるイテレータアダプタです。 別の言い方をすると、双方向イテレータに対して使用したとき、 std::reverse_iterator は、ベースとなる双方向イテレータによって定義されるシーケンスの、終端から先頭へと移動する新しいイテレータを生成します。
イテレータ i から構築された逆イテレータ r について、関係 &*r == &*(i-1) が常に成り立ちます (r が逆参照可能である限り)。 そのため、終端イテレータから構築された逆イテレータは、シーケンスの最後の要素を逆参照します。
これは標準ライブラリのコンテナのメンバ関数 rbegin() および rend() によって返されるイテレータです。
メンバ型
| メンバ型 | 定義 | ||||
iterator_type
|
Iter
| ||||
iterator_concept(C++20以上) |
Iter が std::random_access_iterator をモデル化する場合は std::random_access_iterator_tag、そうでなければ std::bidirectional_iterator_tag
| ||||
iterator_category
|
| ||||
value_type
|
| ||||
difference_type
|
| ||||
pointer
|
std::iterator_traits<Iter>::pointer
| ||||
reference
|
|
|
メンバ型 |
(C++17未満) |
メンバ関数
| 新しいイテレータアダプタを構築します (パブリックメンバ関数) | |
| 別のイテレータを代入します (パブリックメンバ関数) | |
| ベースとなるイテレータにアクセスします (パブリックメンバ関数) | |
| イテレータの指す先の要素にアクセスします (パブリックメンバ関数) | |
| インデックスによって要素にアクセスします (パブリックメンバ関数) | |
| イテレータをインクリメントもしくはデクリメントします (パブリックメンバ関数) |
メンバオブジェクト
| メンバ名 | 定義 |
current (protected)
|
base() イテレータのコピー |
非メンバ関数
(C++14) |
引数から推定した型の std::reverse_iterator を作成します (関数テンプレート) |
| ベースとなるイテレータを比較します (関数テンプレート) | |
| イテレータを進めます (関数テンプレート) | |
| 2つのイテレータアダプタ間の距離を計算します (関数テンプレート) | |
(C++20) |
調節されたベースとなるイテレータを逆参照した結果をその関連する右辺値参照型にキャストします (関数テンプレート) |
(C++20) |
2つの調節されたベースとなるイテレータの指す先のオブジェクトを入れ替えます (関数テンプレート) |
ノート
std::reverse_iterator はメンバオブジェクトへの参照を返すイテレータ (いわゆる "stashing iterator") に対しては動作しません。 stashing iterator の例は std::filesystem::path::iterator です。
例
#include <iostream>
#include <string>
#include <iterator>
int main()
{
std::string s = "Hello, world";
std::reverse_iterator<std::string::iterator> r = s.rbegin();
r[7] = 'O'; // 'o' を 'O' に置き換えます。
r += 7; // イテレータは 'O' を指します。
std::string rev(r, s.rend());
std::cout << rev << '\n';
}
出力:
OlleH
関連項目
(C++17で非推奨) |
シンプルなイテレータのための型要件の定義を簡単にする基底クラス (クラステンプレート) |