sized-random-access-range (制限サイズ・ランダムアクセス範囲)
From ja.cppreference.net
template< class T >
concept /*sized-random-access-range*/ =
ranges::random_access_range<T> &&
ranges::sized_range<T>;
|
(C++26以降) (説明専用*) |
|
説明専用コンセプト sized-random-access-range は、定数時間で自身のサイズを把握し、その要素へのランダムアクセスを可能にする範囲 型の要件を指定します。
注記
sized-random-access-range は、非有界範囲の引数を拒否するために並列範囲アルゴリズム で使用されます。その理由は以下の通りです:
- 効率的な並列実装のためには、反復空間の境界を知っている必要があります。そうでなければ、複数の実行スレッドのための処理を作成する「分割統治」戦略を適用するのは困難です。
- 逐次範囲アルゴリズムは
std::ranges::views::iota(0)のような「無限」範囲の受け渡しを許可しますが、それは無限ループを引き起こす可能性があります。並列実行の場合にそれが有用であるとは想像し難いです。データシーケンスが有界であることを要求することで、実行時のエラーを潜在的に防ぐことができます。 - 明示的に有界な出力範囲を使用することは、範囲外のデータ変更を防ぐために出力のサイズを常に指定することを推奨または要求する、セキュアコーディングの確立された慣行に従います。
- 複数の入力範囲またはシーケンスが有界である場合、アルゴリズムは通常、最も短いものの終端に達した時点で停止するべきです。アルゴリズムが潜在的に異なる入力サイズを持つ2つのシーケンスを受け取り、反復回数としてより小さい方を選択する既存の例が標準内にあります。例としては std::ranges::transform や std::ranges::mismatch があります。
- 出力データシーケンスが有界であるため、それらがすべての入力に対して十分なスペースを持つとはもはや想定されません。したがって、アルゴリズムによって入力シーケンスの一部の要素が処理されない可能性があり、アルゴリズムが処理を停止したこれらのシーケンス内の位置へのイテレータを返すことは理にかなっています。