名前空間
変種
操作

std::ranges::views::reverse, std::ranges::reverse_view

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
ヘッダ <ranges> で定義
template< ranges::view V >

    requires ranges::bidirectional_range<V>
class reverse_view

    : public ranges::view_interface<reverse_view<V>>
(1) (C++20以降)
namespace views {

    inline constexpr /* 非指定 */ reverse = /* 非指定 */;

}
(2) (C++20以降)
呼び出しシグネチャ
template< ranges::viewable_range R >

    requires /* 以下を参照 */

constexpr ranges::view auto reverse( R&& r );
(C++20以降)
1) 基になるviewを逆順で表すビューアダプタ。
2) RangeAdaptorObject。式 views::reverse(e) は、e が一度だけ評価されることを除き、以下のいずれかの式と同等です。
  • e.base()、ただし e の型が reverse_view の(おそらく cv 修飾された)特殊化である場合。
  • それ以外の場合、e の型が、あるイテレータ型 Iranges::subrange_kind 型の値 K に対する(おそらく cv 修飾された)ranges::subrange<std::reverse_iterator<I>, std::reverse_iterator<I>, K> である場合。
  • ranges::subrange<I, I, K>(e.end().base(), e.begin().base(), e.size())、ただし Kranges::subrange_kind::sized の場合。
  • それ以外の場合 ranges::subrange<I, I, K>(e.end().base(), e.begin().base())
  • それ以外の場合 ranges::reverse_view{e}
つまり、views::reverse は可能であれば逆順ビューをアンラップします。

reverse_view は常に bidirectional_range および common_range をモデルとし、基になるビュー型 V が対応するコンセプトをモデルとする場合、borrowed_rangesized_range、または random_access_range をモデルとします。

目次

[編集] データメンバー

メンバ 説明
V base_ (private) 基盤となるビュー
(説明用のメンバオブジェクト*)
non-propagating-cache<ranges::iterator_t<V>> cached_end_ (private)
Vcommon_range を満たさない場合にのみ存在します)
begin() の呼び出し結果をキャッシュするオブジェクト。
(説明用のメンバオブジェクト*)

[編集] メンバ関数

reverse_view を構築します。
(public member function)
基本となるビュー V を返す
(public member function)
reverse_view の開始イテレータを返します。
(public member function)
reverse_view の終了イテレータを返します。
(public member function)
ビューが有界である場合、そのサイズを返す
(public member function)
std::ranges::view_interface から継承
派生ビューが空かどうかを返す。sized_range または forward_range を満たす場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(C++23)
範囲の先頭への定数イテレータを返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(C++23)
範囲の定数イテレータの番兵を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが bidirectional_rangecommon_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]

std::ranges::reverse_view::reverse_view

reverse_view() requires std::default_initializable<V> = default;
(1) (C++20以降)
constexpr reverse_view( V r );
(2) (C++20以降)
1) デフォルトメンバ初期化子 (= V()) を介して base_ を値初期化する。
2) base_std::move(r) で初期化します。

パラメータ

r - 反転する範囲

std::ranges::reverse_view::base

constexpr V base() const& requires std::copy_constructible<V>;
(1) (C++20以降)
constexpr V base() &&;
(2) (C++20以降)

基本となるビューを返す。

1) 基本となるビューから結果をコピー構築する。 return base_; と等価。
2) 基本となるビューから結果をムーブ構築する。 return std::move(base_); と等価。

std::ranges::reverse_view::begin

(1) (C++20以降)
constexpr std::reverse_iterator<ranges::iterator_t<V>> begin()
    requires ranges::common_range<V>;
(2) (C++20以降)
constexpr auto begin() const requires ranges::common_range<const V>;
(3) (C++20以降)
1) std::make_reverse_iterator(ranges::next(ranges::begin(base_), ranges::end(base_))) を返します。range コンセプトで要求される償却定数時間計算量を提供するために、この関数はこのキャッシュオブジェクト内に結果をキャッシュし、後続の呼び出しで使用します。
2,3) return std::make_reverse_iterator(ranges::end(base_)); と同等です。

std::ranges::reverse_view::end

(1) (C++20以降)
constexpr auto end() const requires ranges::common_range<const V>;
(2) (C++20以降)

return std::make_reverse_iterator(ranges::begin(base_)); と同等です。

std::ranges::reverse_view::size

constexpr auto size() requires ranges::sized_range<V>;
(1) (C++20以降)
constexpr auto size() const requires ranges::sized_range<const V>;
(2) (C++20以降)

ビューが有界である場合、そのサイズを返す。

1,2) return ranges::size(base_); と同等です。

[編集] 推論ガイド

template< class R >
reverse_view( R&& ) -> reverse_view<views::all_t<R>>;
(C++20以降)

[編集] ヘルパーテンプレート

template< class T >

constexpr bool enable_borrowed_range<std::ranges::reverse_view<T>> =

    ranges::enable_borrowed_range<T>;
(C++20以降)

この std::ranges::enable_borrowed_range の特殊化により、基になるビューがそれをモデルとする場合、reverse_viewborrowed_range を満たすようになります。

[編集]

#include <iostream>
#include <ranges>
 
int main()
{
    static constexpr auto il = {3, 1, 4, 1, 5, 9};
 
    std::ranges::reverse_view rv{il};
    for (int i : rv)
        std::cout << i << ' ';
    std::cout << '\n';
 
    for (int i : il | std::views::reverse)
        std::cout << i << ' ';
    std::cout << '\n';
 
    // operator[] is inherited from std::view_interface
    for (auto i{0U}; i != rv.size(); ++i)
        std::cout << rv[i] << ' ';
    std::cout << '\n';
}

出力

9 5 1 4 1 3
9 5 1 4 1 3
9 5 1 4 1 3

[編集] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3494 C++20 reverse_viewborrowed_range ではありませんでした。 基になるビューがそうであれば、borrowed_range になる

[編集] 関連項目

逆順走査のためのイテレータアダプタ
(クラステンプレート) [編集]
範囲内の要素の順序を逆にする
(アルゴリズム関数オブジェクト)[編集]
逆順になった範囲のコピーを作成する
(アルゴリズム関数オブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)