名前空間
変種
操作

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

提供: cppreference.com
< cpp
2020年7月17日 (金) 00:57時点におけるMilkpot (トーク | 投稿記録)による版

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
 
 
 

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

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

    namespace views = ranges::views;

}

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


目次

範囲アクセス
ヘッダ <ranges> で定義
ヘッダ <iterator> で定義
名前空間 std::ranges で定義
範囲の先頭を指すイテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
読み込み専用の範囲の先頭を指すイテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲の終端を示す番兵を返します
(カスタマイゼーションポイントオブジェクト) [edit]
読み込み専用の範囲の終端を示す番兵を返します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲の逆イテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
読み込み専用の範囲を指す逆イテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲の逆終端イテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
読み込み専用の範囲を指す逆終端イテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
サイズが定数時間で計算可能な範囲のサイズを取得します
(カスタマイゼーションポイントオブジェクト) [edit]
サイズが定数時間で計算可能な範囲のサイズを取得し、それを符号付き整数に変換します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲が空かどうか調べます
(カスタマイゼーションポイントオブジェクト) [edit]
隣接範囲の先頭を指すポインタを取得します
(カスタマイゼーションポイントオブジェクト) [edit]
読み込み専用の隣接範囲の先頭を指すポインタを取得します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲プリミティブ
ヘッダ <ranges> で定義
名前空間 std::ranges で定義
範囲の関連型を取得します
(エイリアステンプレート) [edit]
ダングリングイテレータ対策
ヘッダ <ranges> で定義
名前空間 std::ranges で定義
ダングリングになるであろうためにイテレータまたは subrange が返されるべきではないことを表すプレースホルダ型
(クラス) [edit]
borrowed_range のイテレータ型または subrange 型を取得します
(エイリアステンプレート) [edit]
範囲コンセプト
ヘッダ <ranges> で定義
名前空間 std::ranges で定義
型が範囲である、つまり、 begin イテレータと end 番兵を提供することを指定します
(コンセプト) [edit]
型が range であり、その式から取得したイテレータがダングリングの危険なく安全に返せることを指定します
(コンセプト) [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]
ビュー
ヘッダ <ranges> で定義
名前空間 std::ranges で定義
奇妙に再帰したテンプレートパターンを用いた view を定義するためのヘルパークラステンプレート
(クラステンプレート) [edit]
イテレータと番兵の組を結合して view にします
(クラステンプレート) [edit]

[編集] 範囲ファクトリ

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

[編集] 範囲アダプタ

範囲アダプタは、第1引数として viewable_range を受け取り、 view を返します。

アダプタが引数を1個だけ取る場合は、パイプ演算子を用いて呼ぶこともできます。 C が範囲アダプタオブジェクトで Rviewable_range の場合、以下の2つの式は同等です。

C(R)
R | C

単項範囲アダプタは別の範囲アダプタを生成するためにチェーンすることもできます。 C および D が範囲アダプタオブジェクトで Rviewable_range の場合、 C | D も範囲アダプタオブジェクトであり、以下の2つの式は同等です。

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

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

adaptor(range, args...)
adaptor(args...)(range)
range | adaptor(args...)

このケースでは 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