名前空間
変種
操作

範囲ライブラリ (C++20)

提供: cppreference.com
< cpp
 
 
 

範囲ライブラリは、様々なビューアダプタを含む、要素の範囲を扱うためのコンポーネントを提供します。

ヘッダ <ranges> で定義
namespace std {

    namespace views = ranges::views;

}

名前空間エイリアス std::viewsstd::ranges::views の短縮形として提供されます。


ヘッダ <ranges> で定義
名前空間 std::ranges で定義

目次

範囲アクセス
範囲の先頭を指すイテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
(C++20)
範囲の終端を指すイテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲の逆イテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
(C++20)
範囲の逆終端イテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
(C++20)
サイズが定数時間で計算可能な範囲のサイズを取得します
(カスタマイゼーションポイントオブジェクト) [edit]
(C++20)
範囲が空かどうか調べます
(カスタマイゼーションポイントオブジェクト) [edit]
(C++20)
隣接範囲の先頭を指すポインタを取得します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲プリミティブ
範囲の関連型を取得します
(エイリアステンプレート) [edit]
ダングリングイテレータ対策
ダングリングになるであろうためにイテレータまたは subrange が返されるべきではないことを表すプレースホルダ型
(クラス) [edit]
__ForwardingRange もモデル化する range のイテレータ型または subrange 型を取得します
(エイリアステンプレート) [edit]
範囲コンセプト
型が範囲である、つまり、 begin イテレータと end 番兵を提供することを指定します
(コンセプト) [edit]
範囲のサイズを定数時間で取得できることを指定します
(コンセプト) [edit]
範囲がビューである、つまり、コピー/ムーブ/代入が定数時間であることを指定します
(コンセプト) [edit]
input_iterator を満たすイテレータ型を持つ範囲を指定します
(コンセプト) [edit]
output_iterator を満たすイテレータ型を持つ範囲を指定します
(コンセプト) [edit]
forward_iterator を満たすイテレータ型を持つ範囲を指定します
(コンセプト) [edit]
bidirectional_iterator を満たすイテレータ型を持つ範囲を指定します
(コンセプト) [edit]
random_access_iterator を満たすイテレータ型を持つ範囲を指定します
(コンセプト) [edit]
contiguous_iterator を満たすイテレータ型を持つ範囲を指定します
(コンセプト) [edit]
範囲のイテレータ型と番兵型が同一であることを指定します
(コンセプト) [edit]
view に安全に変換可能であるための range に対する要件を指定します
(コンセプト) [edit]
ビュー
奇妙に再帰したテンプレートパターンを用いた view を定義するためのヘルパークラステンプレート
(クラステンプレート) [edit]
イテレータと番兵の組を結合して view にします
(クラステンプレート) [edit]

[編集] 範囲ファクトリ

ヘッダ <ranges> で定義
名前空間 std::ranges で定義
要素を持たない空の view
(クラステンプレート) (変数テンプレート) [edit]
指定された値の要素1個を格納する view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) [edit]
初期値を繰り返しインクリメントすることによって生成されるシーケンスから構成される view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) [edit]
イテレータとカウントから部分範囲を作成します
(カスタマイゼーションポイントオブジェクト) [edit]

[編集] 範囲アダプタ

範囲アダプタは、第1引数として viewable_range を受け取り、 view を返します。 これらはパイプ演算子を用いてチェーンできます。 CD が範囲アダプタで Rviewable_range である場合、以下の2つの式は同等です。

D(C(R))
R | C | D

アダプタが複数の引数を取る場合、以下の形式は同等です。

adaptor(range, args...)
adaptor(args...)(range)
range | adaptor(args...)
ヘッダ <ranges> で定義
名前空間 std::ranges で定義
range のすべての要素を含む view
(エイリアステンプレート) (範囲アダプタオブジェクト) [edit]
何らかの他の range の要素の view
(クラステンプレート) [edit]
述語を満たす range の要素から構成される view
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
各要素に変換関数を適用するシーケンスの view
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
別の view の最初の N 個の要素から構成される view
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
別の view の最初の要素から述語が false を返す最初の要素までで構成される view
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
別の view の最初の N 個の要素をスキップした要素から構成される view
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
別の view の述語が false を返す最初の要素までの先頭部分列をスキップした要素から構成される view
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
rangeview を平坦化することによって得られるシーケンスから構成される view
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
別の view を区切り文字で分割することによって得られる部分範囲群に対する view
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
viewcommon_range に変換します
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
別の双方向ビューの要素を逆順でイテレートする view
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
紐付いた入力ストリームに >> 演算子を連続的に適用することによって取得した要素から構成される view
(クラステンプレート) [edit]
タプルライクな値から構成される view と数値 N を取り、各タプルの N 番目の要素の view を生成します
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
ペアライクな値から構成される view を取り、各ペアの第1要素の view を生成します
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
ペアライクな値から構成される view を取り、各ペアの第2要素の view を生成します
(クラステンプレート) (範囲アダプタオブジェクト) [edit]

一部の範囲アダプタはその要素または関数オブジェクトを semiregular ラッパーでラップします。

[編集] ヘルパーコンセプト

いくつかの型のために以下の説明専用コンセプトが使用されますが、これらは標準ライブラリのインタフェースの一部ではありません。

template<class R>

  concept __SimpleView =                         // 説明専用
    ranges::view<R> && ranges::range<const R> &&
    std::same_as<std::ranges::iterator_t<R>, std::ranges::iterator_t<const R>> &&

    std::same_as<std::ranges::sentinel_t<R>, std::ranges::sentinel_t<const R>>;
template<class T, class U>

  concept __NotSameAs =                          // 説明専用

    !std::same_as<std::remove_cvref_t<T>, std::remove_cvref_t<U>>;

[編集]

#include <vector>
#include <ranges>
#include <iostream>
 
int main()
{
    std::vector<int> ints{0,1,2,3,4,5};
    auto even = [](int i){ return 0 == i % 2; };
    auto square = [](int i) { return i * i; };
 
    for (int i : ints | std::views::filter(even) | std::views::transform(square)) {
        std::cout << i << ' ';
    }
}

出力:

0 4 16