Namespaces
Variants

std:: reverse_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
ヘッダーで定義 <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() によって返されるイテレータです。

range-rbegin-rend.svg

目次

ネストされた型

定義
iterator_type Iter
iterator_category std:: iterator_traits < Iter > :: iterator_category [1]
value_type std:: iterator_traits < Iter > :: value_type [1]
difference_type std:: iterator_traits < Iter > :: difference_type
pointer std:: iterator_traits < Iter > :: pointer
reference std:: iterator_traits < Iter > :: reference
(C++20まで)
定義
iterator_type Iter
iterator_concept
iterator_category
value_type std:: iter_value_t < Iter >
difference_type std:: iter_difference_t < Iter >
pointer std:: iterator_traits < Iter > :: pointer
reference std:: iter_reference_t < Iter >
(C++20以降)
  1. 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つの調整された基底イテレータが指すオブジェクトを交換する
(関数テンプレート)
引数から型が推論される std::reverse_iterator を作成する
(関数テンプレート)

ヘルパーテンプレート

template < class Iterator1, class Iterator2 >

requires ( ! std:: sized_sentinel_for < Iterator1, Iterator2 > )
inline constexpr bool disable_sized_sentinel_for

< std :: reverse_iterator < Iterator1 > , std :: reverse_iterator < Iterator2 >> = true ;
(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

関連項目

引数の型から推論される std::reverse_iterator を作成する
(関数テンプレート)
(C++17で非推奨)
単純なイテレータに必要な型の定義を容易にする基底クラス
(クラステンプレート)