• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    class template
    <ranges>

    std::ranges::reverse_view

    namespace std::ranges {
      template<view V>
        requires bidirectional_range<V>
      class reverse_view : public view_interface<reverse_view<V>> { …… };   // (1)
    
      namespace views {
        inline constexpr /*unspecified*/ reverse = /*unspecified*/;         // (2)
      }
    }
    

    概要

    • (1): 任意のbidirectional_rangeを逆順にするview
    • (2): reverse_viewまたは同じ効果を実現するviewを生成するRangeアダプタオブジェクト

    Rangeコンセプト

    borrowed sized output input forward bidirectional random_access contiguous common viewable view

    ※ 参照先のRangeに従う

    テンプレートパラメータ制約

    効果

    • (2): 式views::reverse(E)の効果は次の通り
      • Eの型がreverse_viewの特殊化であれば、E.base()と等しい (CV修飾されている場合を含む)
      • イテレータ型Isubrange_kindの値Kに対し、Eの型がCV修飾されたsubrange<reverse_iterator<I>,reverse_iterator<I>, K>であるとする。このとき、Eは一度しか評価されないとして、
        • Ksubrange_kind::sizedであれば、subrange<I, I, K>(E.end().base(), E.begin().base(), E.size())と等しい
        • それ以外のとき、subrange<I, I, K>(E.end().base(), E.begin().base())と等しい
      • それ以外のとき、reverse_view{E}と等しい

    V | views::reverse | views::reverseのように連続して適用したとき、結果として元に戻るのではなく、初めから逆順にしないようになる。

    メンバ関数

    名前 説明 対応バージョン
    (constructor) コンストラクタ C++20
    base Vの参照を取得する C++20
    begin 先頭を指すイテレータを取得する C++20
    end 番兵を取得する C++20
    size 要素数を取得する C++20

    rを参照先のRangeとする。sizeは、ranges::size(r)が有効な式であるときに定義される。

    継承しているメンバ関数

    名前 説明 対応バージョン
    empty Rangeが空かどうかを判定する C++20
    operator bool Rangeが空でないかどうかを判定する C++20
    data Rangeの先頭へのポインタを取得する C++20
    front 先頭要素への参照を取得する C++20
    back 末尾要素への参照を取得する C++20
    operator[] 要素へアクセスする C++20
    cbegin 定数イテレータを取得する C++23
    cend 定数イテレータ(番兵)を取得する C++23

    推論補助

    名前 説明 対応バージョン
    (deduction_guide) クラステンプレートの推論補助 C++20

    #include <ranges>
    #include <concepts>
    #include <string_view>
    #include <iostream>
    
    int main() {
      using namespace std;
      using namespace std::literals;
    
      for(char c : "Hello"sv | views::reverse) {
        cout << c;
      }
      cout << '\n';
    
      // reverseを2回適用すると元の型に戻る
      static_assert(same_as<string_view, decltype(""sv | views::reverse | views::reverse)>);
    }
    

    出力

    olleH
    

    実装例

    namespace std::ranges {
      template<view V>
        requires bidirectional_range<V>
      class reverse_view : public view_interface<reverse_view<V>> {
      private:
        V base_ = V();
        optional<reverse_iterator<iterator_t<V>>> cache_;
      public:
        reverse_view() requires default_initializable<V> = default;
    
        constexpr explicit reverse_view(V r) : base_(std::move(r)) {}
    
        constexpr V base() const & requires copy_constructible<V> { return base_; }
        constexpr V base() && { return std::move(base_); }
    
        constexpr reverse_iterator<iterator_t<V>> begin() {
          // 償却定数時間で返すためのキャッシュ
          if (!cache_)
            cache_ = make_reverse_iterator(ranges::next(ranges::begin(base_), ranges::end(base_)));
          return *cache_;
        }
        constexpr reverse_iterator<iterator_t<V>> begin() requires common_range<V> {
          return make_reverse_iterator(ranges::end(base_));
        }
        constexpr auto begin() const requires common_range<const V> {
          return make_reverse_iterator(ranges::end(base_));
        }
    
        constexpr reverse_iterator<iterator_t<V>> end() {
          return make_reverse_iterator(ranges::begin(base_));
        }
        constexpr auto end() const requires common_range<const V> {
          return make_reverse_iterator(ranges::begin(base_));
        }
    
        constexpr auto size() requires sized_range<V> {
          return ranges::size(base_);
        }
    
        constexpr auto size() const requires sized_range<const V> {
          return ranges::size(base_);
        }
      };
    
      template<class R>
      reverse_view(R&&) -> reverse_view<views::all_t<R>>;
    }
    

    バージョン

    言語

    • C++20

    処理系

    参照