制約付きアルゴリズム (C++20より)
From cppreference.com
C++20では、名前空間 std::ranges 内にほとんどのアルゴリズムの制約付き版が提供されています。これらのアルゴリズムでは、範囲はイテレータと番兵のペア、または単一のrange引数として指定でき、射影やメンバへのポインタによる呼び出しがサポートされています。さらに、ほとんどのアルゴリズムの戻り値の型は、アルゴリズムの実行中に計算された潜在的に有用なすべての情報を返すように変更されました。
目次 |
[編集] アルゴリズム関数オブジェクト
アルゴリズム関数オブジェクト (AFO)、非公式にはニーブロイドとして知られるものは、1つ以上のオーバーロードされた関数テンプレートとして指定されるカスタマイゼーションポイントオブジェクト (CPO) です。これらの関数テンプレートの名前は、対応するアルゴリズム関数オブジェクトを指定します。
アルゴリズム関数オブジェクト o について、S を対応する関数テンプレートの集合とします。このとき、任意の引数シーケンス args... に対して、o(args...) は s(args...) と式として等価です。ここで s の名前探索の結果はオーバーロード集合 S です。
名前空間 std::ranges の制約付きアルゴリズムは、アルゴリズム関数オブジェクトとして定義されます。その結果、
- これらのいずれかを呼び出す際に、明示的なテンプレート引数リストを指定することはできません。
- これらのいずれも実引数依存の名前探索には見えません。
- これらのいずれかが関数呼び出し演算子の左側の名前として通常の非修飾名探索によって見つかった場合、実引数依存の名前探索は抑制されます。
[編集] 制約付きアルゴリズム
| ヘッダー
<algorithm> で定義 | |
| 名前空間
std::ranges で定義 | |
シーケンスを変更しない操作 | |
| (C++20)(C++20)(C++20) |
範囲内のすべての、いずれかの、またはどの要素も述語が true にならないかをチェックする (アルゴリズム関数オブジェクト) |
| (C++20) |
範囲内の要素に単項関数オブジェクトを適用する (アルゴリズム関数オブジェクト) |
| (C++20) |
シーケンスの最初のN個の要素に関数オブジェクトを適用する (アルゴリズム関数オブジェクト) |
| (C++20)(C++20) |
特定の基準を満たす要素の数を返す (アルゴリズム関数オブジェクト) |
| (C++20) |
2つの範囲が異なる最初の位置を見つける (アルゴリズム関数オブジェクト) |
| (C++20) |
2つの要素の集合が同じかどうかを判断する (アルゴリズム関数オブジェクト) |
| ある範囲が別の範囲より辞書順で小さい場合に true を返す (アルゴリズム関数オブジェクト) | |
| (C++20)(C++20)(C++20) |
特定の基準を満たす最初の要素を見つける (アルゴリズム関数オブジェクト) |
| (C++23)(C++23)(C++23) |
特定の基準を満たす最後の要素を見つける (アルゴリズム関数オブジェクト) |
| (C++20) |
特定の範囲内で最後の要素のシーケンスを見つける (アルゴリズム関数オブジェクト) |
| (C++20) |
要素の集合のうちいずれか1つを検索する (アルゴリズム関数オブジェクト) |
| (C++20) |
等しい(または指定された述語を満たす)最初の2つの隣接する項目を見つける (アルゴリズム関数オブジェクト) |
| (C++20) |
要素の範囲の最初の出現を検索する (アルゴリズム関数オブジェクト) |
| (C++20) |
範囲内である要素が連続して出現する最初の箇所を検索する (アルゴリズム関数オブジェクト) |
| (C++23)(C++23) |
範囲が指定された要素または部分範囲を含むかチェックする (アルゴリズム関数オブジェクト) |
| (C++23) |
ある範囲が別の範囲で始まるかチェックする (アルゴリズム関数オブジェクト) |
| (C++23) |
ある範囲が別の範囲で終わるかチェックする (アルゴリズム関数オブジェクト) |
シーケンスを変更する操作 | |
| (C++20)(C++20) |
要素の範囲を新しい場所にコピーする (アルゴリズム関数オブジェクト) |
| (C++20) |
指定された数の要素を新しい場所にコピーする (アルゴリズム関数オブジェクト) |
| (C++20) |
要素の範囲を逆順にコピーする (アルゴリズム関数オブジェクト) |
| (C++20) |
要素の範囲を新しい場所にムーブする (アルゴリズム関数オブジェクト) |
| (C++20) |
要素の範囲を逆順で新しい場所にムーブする (アルゴリズム関数オブジェクト) |
| (C++20) |
要素の範囲に特定の値を代入する (アルゴリズム関数オブジェクト) |
| (C++20) |
指定された数の要素に値を代入する (アルゴリズム関数オブジェクト) |
| (C++20) |
要素の範囲に関数を適用する (アルゴリズム関数オブジェクト) |
| (C++20) |
関数の結果を範囲に保存する (アルゴリズム関数オブジェクト) |
| (C++20) |
関数のN回の適用の結果を保存する (アルゴリズム関数オブジェクト) |
| (C++20)(C++20) |
特定の基準を満たす要素を削除する (アルゴリズム関数オブジェクト) |
| (C++20)(C++20) |
特定の基準を満たす要素を除外して範囲をコピーする (アルゴリズム関数オブジェクト) |
| (C++20)(C++20) |
特定の基準を満たすすべての値を別の値に置き換える (アルゴリズム関数オブジェクト) |
| (C++20)(C++20) |
特定の基準を満たす要素を別の値に置き換えながら範囲をコピーする (アルゴリズム関数オブジェクト) |
| (C++20) |
2つの要素の範囲を交換する (アルゴリズム関数オブジェクト) |
| (C++20) |
範囲内の要素の順序を逆にする (アルゴリズム関数オブジェクト) |
| (C++20) |
逆順になった範囲のコピーを作成する (アルゴリズム関数オブジェクト) |
| (C++20) |
範囲内の要素の順序を回転させる (アルゴリズム関数オブジェクト) |
| (C++20) |
要素の範囲をコピーして回転させる (アルゴリズム関数オブジェクト) |
| (C++20) |
範囲内の要素をランダムに並べ替える (アルゴリズム関数オブジェクト) |
| 範囲内の要素をシフトする (アルゴリズム関数オブジェクト) | |
| (C++20) |
シーケンスからN個のランダムな要素を選択する (アルゴリズム関数オブジェクト) |
| (C++20) |
範囲内の連続する重複要素を削除する (アルゴリズム関数オブジェクト) |
| (C++20) |
連続する重複を含まない要素の範囲のコピーを作成する (アルゴリズム関数オブジェクト) |
パーティション操作 | |
| (C++20) |
範囲が指定された述語によってパーティション化されているかどうかを判断する (アルゴリズム関数オブジェクト) |
| (C++20) |
要素の範囲を2つのグループに分割する (アルゴリズム関数オブジェクト) |
| (C++20) |
要素を2つのグループに分割しながら範囲をコピーする (アルゴリズム関数オブジェクト) |
| (C++20) |
相対的な順序を維持しながら要素を2つのグループに分割する (アルゴリズム関数オブジェクト) |
| (C++20) |
パーティション化された範囲のパーティションポイントを見つける (アルゴリズム関数オブジェクト) |
ソート操作 | |
| (C++20) |
範囲が昇順にソートされているかどうかをチェックする (アルゴリズム関数オブジェクト) |
| (C++20) |
ソートされている最大のサブ範囲を見つける (アルゴリズム関数オブジェクト) |
| (C++20) |
範囲を昇順にソートする (アルゴリズム関数オブジェクト) |
| (C++20) |
範囲の最初のN個の要素をソートする (アルゴリズム関数オブジェクト) |
| (C++20) |
要素の範囲をコピーして部分的にソートする (アルゴリズム関数オブジェクト) |
| (C++20) |
等しい要素間の順序を維持しながら要素の範囲をソートする (アルゴリズム関数オブジェクト) |
| (C++20) |
与えられた範囲を部分的にソートし、指定された要素によってパーティション化されるようにする (アルゴリズム関数オブジェクト) |
二分探索操作 (ソート済み範囲) | |
| (C++20) |
与えられた値より小さくない最初の要素へのイテレータを返す (アルゴリズム関数オブジェクト) |
| (C++20) |
特定の値より大きい最初の要素へのイテレータを返す (アルゴリズム関数オブジェクト) |
| (C++20) |
部分的に順序付けられた範囲に要素が存在するかどうかを判断する (アルゴリズム関数オブジェクト) |
| (C++20) |
特定のキーに一致する要素の範囲を返す (アルゴリズム関数オブジェクト) |
集合操作 (ソート済み範囲) | |
| (C++20) |
2つのソート済み範囲をマージする (アルゴリズム関数オブジェクト) |
| (C++20) |
2つの順序付けられた範囲をインプレースでマージする (アルゴリズム関数オブジェクト) |
| (C++20) |
あるシーケンスが別のシーケンスの部分シーケンスである場合に true を返す (アルゴリズム関数オブジェクト) |
| (C++20) |
2つの集合の差を計算する (アルゴリズム関数オブジェクト) |
| (C++20) |
2つの集合の積を計算する (アルゴリズム関数オブジェクト) |
| 2つの集合の対称差を計算する (アルゴリズム関数オブジェクト) | |
| (C++20) |
2つの集合の和を計算する (アルゴリズム関数オブジェクト) |
ヒープ操作 | |
| (C++20) |
与えられた範囲が最大ヒープであるかをチェックする (アルゴリズム関数オブジェクト) |
| (C++20) |
最大ヒープである最大のサブ範囲を見つける (アルゴリズム関数オブジェクト) |
| (C++20) |
要素の範囲から最大ヒープを作成する (アルゴリズム関数オブジェクト) |
| (C++20) |
最大ヒープに要素を追加する (アルゴリズム関数オブジェクト) |
| (C++20) |
最大ヒープから最大の要素を削除する (アルゴリズム関数オブジェクト) |
| (C++20) |
最大ヒープを昇順にソートされた要素の範囲に変換する (アルゴリズム関数オブジェクト) |
最小/最大操作 | |
| (C++20) |
与えられた値のうち大きい方を返す (アルゴリズム関数オブジェクト) |
| (C++20) |
範囲内で最大の要素を返す (アルゴリズム関数オブジェクト) |
| (C++20) |
与えられた値のうち小さい方を返す (アルゴリズム関数オブジェクト) |
| (C++20) |
範囲内で最小の要素を返す (アルゴリズム関数オブジェクト) |
| (C++20) |
2つの要素の小さい方と大きい方を返す (アルゴリズム関数オブジェクト) |
| (C++20) |
範囲内で最小の要素と最大の要素を返す (アルゴリズム関数オブジェクト) |
| (C++20) |
値を一対の境界値の間に制限する (アルゴリズム関数オブジェクト) |
順列操作 | |
| (C++20) |
あるシーケンスが別のシーケンスの順列であるかを判断する (アルゴリズム関数オブジェクト) |
| (C++20) |
要素の範囲の次に大きい辞書順の順列を生成する (アルゴリズム関数オブジェクト) |
| (C++20) |
要素の範囲の次に小さい辞書順の順列を生成する (アルゴリズム関数オブジェクト) |
[編集] 制約付き数値演算
| ヘッダー
<numeric> で定義 | |
| 名前空間
std::ranges で定義 | |
| (C++23) |
開始値からの連続した増分値で範囲を埋める (アルゴリズム関数オブジェクト) |
[編集] 制約付き畳み込み操作
| ヘッダー
<algorithm> で定義 | |
| 名前空間
std::ranges で定義 | |
| (C++23) |
要素の範囲を左畳み込みする (アルゴリズム関数オブジェクト) |
| (C++23) |
最初の要素を初期値として要素の範囲を左畳み込みする (アルゴリズム関数オブジェクト) |
| (C++23) |
要素の範囲を右畳み込みする (アルゴリズム関数オブジェクト) |
| (C++23) |
最後の要素を初期値として要素の範囲を右畳み込みする (アルゴリズム関数オブジェクト) |
| (C++23) |
要素の範囲を左畳み込みし、ペア (イテレータ, 値) を返す (アルゴリズム関数オブジェクト) |
| 最初の要素を初期値として要素の範囲を左畳み込みし、ペア (イテレータ, optional) を返す (アルゴリズム関数オブジェクト) | |
[編集] 制約付き未初期化メモリアルゴリズム
| ヘッダ
<memory> で定義 | |
| 名前空間
std::ranges で定義 | |
| (C++20) |
オブジェクトの範囲を未初期化メモリ領域にコピーします (アルゴリズム関数オブジェクト) |
| (C++20) |
指定された数のオブジェクトを未初期化メモリ領域にコピーします (アルゴリズム関数オブジェクト) |
| (C++20) |
範囲で定義された未初期化メモリ領域にオブジェクトをコピーします (アルゴリズム関数オブジェクト) |
| (C++20) |
開始位置と個数で定義された未初期化メモリ領域にオブジェクトをコピーします (アルゴリズム関数オブジェクト) |
| (C++20) |
オブジェクトの範囲を未初期化メモリ領域にムーブします (アルゴリズム関数オブジェクト) |
| (C++20) |
指定された数のオブジェクトを未初期化メモリ領域にムーブします (アルゴリズム関数オブジェクト) |
| 範囲で定義された未初期化メモリ領域に、デフォルト初期化によってオブジェクトを構築します (アルゴリズム関数オブジェクト) | |
| 開始位置と個数で定義された未初期化メモリ領域に、デフォルト初期化によってオブジェクトを構築します (アルゴリズム関数オブジェクト) | |
| 範囲で定義された未初期化メモリ領域に、値初期化によってオブジェクトを構築します (アルゴリズム関数オブジェクト) | |
| 開始位置と個数で定義された未初期化メモリ領域に、値初期化によってオブジェクトを構築します (アルゴリズム関数オブジェクト) | |
| (C++20) |
オブジェクトの範囲を破棄します (アルゴリズム関数オブジェクト) |
| (C++20) |
範囲内の指定された数のオブジェクトを破棄します (アルゴリズム関数オブジェクト) |
| (C++20) |
与えられたアドレスのオブジェクトを破棄します (アルゴリズム関数オブジェクト) |
| (C++20) |
与えられたアドレスにオブジェクトを作成します (アルゴリズム関数オブジェクト) |
[編集] 制約付き乱数アルゴリズム
| ヘッダー
<random> で定義 | |
| 名前空間
std::ranges で定義 | |
| (C++26) |
一様乱数ビット生成器からの乱数で範囲を埋める (アルゴリズム関数オブジェクト) |
[編集] 戻り値の型
| ヘッダー
<algorithm> で定義 | |
| 名前空間
std::ranges で定義 | |
| (C++20) |
イテレータと関数オブジェクトを単一のユニットとして格納する方法を提供する (クラステンプレート) |
| (C++20) |
2つのイテレータを単一のユニットとして格納する方法を提供する (クラステンプレート) |
| (C++20) |
2つのイテレータを単一のユニットとして格納する方法を提供する (クラステンプレート) |
| (C++20) |
3つのイテレータを単一のユニットとして格納する方法を提供する (クラステンプレート) |
| (C++20) |
3つのイテレータを単一のユニットとして格納する方法を提供する (クラステンプレート) |
| (C++20) |
同じ型の2つのオブジェクトまたは参照を単一のユニットとして格納する方法を提供する (クラステンプレート) |
| (C++20) |
イテレータとブールフラグを単一のユニットとして格納する方法を提供する (クラステンプレート) |
| (C++23) |
イテレータと値を単一のユニットとして格納する方法を提供する (クラステンプレート) |
| (C++23) |
イテレータと値を単一のユニットとして格納する方法を提供する (クラステンプレート) |
[編集] 注意
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type |
202403L |
(C++26) | アルゴリズムのリスト初期化 |
__cpp_lib_ranges |
201911L |
(C++20) | Rangeライブラリ と 制約付きアルゴリズム |
__cpp_lib_ranges_contains |
202207L |
(C++23) | std::ranges::contains |
__cpp_lib_ranges_find_last |
202207L |
(C++23) | std::ranges::find_last |
__cpp_lib_ranges_fold |
202207L |
(C++23) | std::ranges 畳み込みアルゴリズム |
__cpp_lib_ranges_iota |
202202L |
(C++23) | std::ranges::iota |
__cpp_lib_ranges_starts_ends_with |
202106L |
(C++23) | std::ranges::starts_with, std::ranges::ends_with |
__cpp_lib_shift |
201806L |
(C++20) | std::shift_left, std::shift_right |
202202L |
(C++23) | std::ranges::shift_left, std::ranges::shift_right | |
__cpp_lib_ranges_generate_random |
202403L |
(C++26) | std::ranges::generate_random |
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| P3136R1 | C++20 | ニーブロイドは特別なエンティティとして指定することが許可されていた 関数オブジェクト以外 |
関数オブジェクトとして指定することが要求された |