制約付きアルゴリズム (C++20以降)
in_value_result(C++23)C++20は、名前空間 std::rangesstd::ranges 内のほとんどのアルゴリズムの制約付きバージョンを提供します。これらのアルゴリズムでは、レンジはイテレータ-センチネルペア、または単一のレンジ引数として指定でき、射影やメンバポインタ呼び出し可能オブジェクトがサポートされています。さらに、ほとんどのアルゴリズムの戻り値の型は、アルゴリズムの実行中に計算されたすべての有用な情報を返すように変更されています。
アルゴリズム関数オブジェクト
アルゴリズム関数オブジェクト (AFO) は、非公式に ニーブロイド として知られ、一つ以上のオーバーロードされた関数テンプレートとして指定される カスタマイゼーションポイントオブジェクト (CPO) です。これらの関数テンプレートの名前は、対応するアルゴリズム関数オブジェクトを指定します。
アルゴリズム関数オブジェクト o について、S を対応する関数テンプレートの集合とします。そのとき、任意の引数列 args... に対して、o(args...) は 式等価 に s(args...) であり、ここで s の名前検索の結果はオーバーロード集合 S です。
名前空間 std::ranges 内の制約付きアルゴリズムは、アルゴリズム関数オブジェクトとして定義されています。その結果:
- それらのいずれかを呼び出す際に、明示的なテンプレート引数リストを指定することはできません。
- それらはいずれも引数依存の名前検索の対象になりません。
- それらのいずれかが通常の非修飾名前検索によって関数呼び出し演算子の左側の名前として見つかった場合、引数依存の名前検索は抑制されます。
範囲パラメータ
いくつかのオーバーロードは range 引数を取り、それらは、別個のイテレータとセンチネル引数を取る名前空間 ranges 内の対応するオーバーロードにディスパッチすることによって実装されているかのように振る舞い、ここで各範囲引数 r について:
- 対応するイテレータ引数は
ranges::begin(r)で初期化されます。
|
(C++26まで) |
|
(C++26以降) |
変更しないシーケンス操作
ヘッダで定義
<algorithm> | |
名前空間で定義
std::ranges | |
バッチ操作 | |
(C++20) |
単項を適用する 関数オブジェクト に要素から 範囲 (アルゴリズム関数オブジェクト) |
(C++20) |
シーケンスの最初のN個の要素に関数オブジェクトを適用する (アルゴリズム関数オブジェクト) |
検索操作 | |
(C++20)(C++20)(C++20) |
述語がtrueであるかどうかを、範囲の全て、いずれか、またはなしに対して確認します(アルゴリズム関数オブジェクト) |
(C++23)(C++23) |
範囲に指定された要素または部分範囲が含まれているかどうかを確認します (アルゴリズム関数オブジェクト) |
(C++20)(C++20)(C++20) |
特定の条件を満たす最初の要素を検索します (アルゴリズム関数オブジェクト) |
(C++23)(C++23)(C++23) |
特定の条件を満たす最後の要素を検索します (アルゴリズム関数オブジェクト) |
(C++20) |
指定範囲内の要素の最後のシーケンスを検索します (アルゴリズム関数オブジェクト) |
(C++20) |
要素の集合のいずれかを検索します (アルゴリズム関数オブジェクト) |
(C++20) |
等しい(または指定された述語を満たす)最初の隣接する2つの項目を検索します (アルゴリズム関数オブジェクト) |
(C++20)(C++20) |
特定の条件を満たす要素の数を返します (アルゴリズム関数オブジェクト) |
(C++20) |
2つの範囲が異なる最初の位置を検索します (アルゴリズム関数オブジェクト) |
(C++20) |
2つの要素セットが同じかどうかを判定します (アルゴリズム関数オブジェクト) |
(C++20) |
要素の範囲の最初の出現を検索します (アルゴリズム関数オブジェクト) |
(C++20) |
範囲内で指定された数の連続する要素のコピーの最初の出現を検索します (アルゴリズム関数オブジェクト) |
(C++23) |
範囲が別の範囲で始まるかどうかを確認します (アルゴリズム関数オブジェクト) |
(C++23) |
範囲が別の範囲で終わるかどうかを確認します (アルゴリズム関数オブジェクト) |
畳み込み操作 | |
(C++23) |
要素の範囲を左畳み込みする (アルゴリズム関数オブジェクト) |
(C++23) |
最初の要素を初期値として要素の範囲を左畳み込みする (アルゴリズム関数オブジェクト) |
(C++23) |
要素の範囲を右畳み込みする (アルゴリズム関数オブジェクト) |
(C++23) |
最後の要素を初期値として要素の範囲を右畳み込みする (アルゴリズム関数オブジェクト) |
(C++23) |
要素の範囲を左畳み込みし、 pair (iterator, value) (アルゴリズム関数オブジェクト) |
| 最初の要素を初期値として要素の範囲を左畳み込みし、 pair (iterator, optional) (アルゴリズム関数オブジェクト) | |
シーケンスを変更する操作
ヘッダで定義
<algorithm> | |
名前空間で定義
std::ranges | |
コピー操作 | |
(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) |
範囲の要素に特定の値を代入する (アルゴリズム関数オブジェクト) |
(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) |
範囲内の要素の順序を回転させる (アルゴリズム関数オブジェクト) |
(C++20) |
範囲の要素をコピーして回転させる (アルゴリズム関数オブジェクト) |
(C++23)(C++23) |
範囲内の要素をシフトする (アルゴリズム関数オブジェクト) |
(C++20) |
範囲内の要素をランダムに並べ替える (アルゴリズム関数オブジェクト) |
サンプリング操作 | |
(C++20) |
シーケンスから N 個のランダム要素を選択する (アルゴリズム関数オブジェクト) |
ヘッダで定義
<algorithm> | |
名前空間で定義
std::ranges | |
分割操作 | |
(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) |
範囲がソートされていた場合のN番目の要素を見つける (アルゴリズム関数オブジェクト) |
二分探索操作(ソート済み範囲に対する) | |
(C++20) |
二分探索を使用して、指定された値以上の最初の要素を検索する (algorithm function object) |
(C++20) |
二分探索を使用して、指定された値より大きい最初の要素を検索する (algorithm function object) |
(C++20) |
二分探索を使用して、範囲内に要素が存在するかどうかを判定する (algorithm function object) |
(C++20) |
二分探索を使用して、指定された値に一致する要素の範囲を検索する (algorithm function object) |
集合操作 (ソート済み範囲に対する) | |
(C++20) |
一方のシーケンスが他方の部分列かどうかを判定する (アルゴリズム関数オブジェクト) |
(C++20) |
二つの集合の差を計算する (アルゴリズム関数オブジェクト) |
(C++20) |
二つの集合の積集合を計算する (アルゴリズム関数オブジェクト) |
| 二つの集合の対称差を計算する (アルゴリズム関数オブジェクト) | |
(C++20) |
二つの集合の和集合を計算する (アルゴリズム関数オブジェクト) |
マージ操作(ソート済み範囲に対する) | |
(C++20) |
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)
|
値を境界値のペアの間にクランプする
(アルゴリズム関数オブジェクト) |
辞書式比較操作 | |
| 2つの範囲を辞書式に比較する (アルゴリズム関数オブジェクト) | |
順列操作 |
|
|
(C++20)
|
あるシーケンスが別のシーケンスの順列であるかどうかを判定する
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
要素の範囲の次のより大きい辞書順の順列を生成する
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
要素の範囲の次のより小さい辞書順の順列を生成する
(アルゴリズム関数オブジェクト) |
数値演算
ヘッダで定義
<numeric> | |
名前空間で定義
std::ranges | |
(C++23) |
範囲を開始値の連続的な増分で埋める (アルゴリズム関数オブジェクト) |
特殊化された<memory>アルゴリズム
ヘッダで定義
<memory> | |
名前空間で定義
std::ranges | |
オブジェクト(一括)構築 | |
(C++20) |
指定されたアドレスにオブジェクトを作成する (アルゴリズム関数オブジェクト) |
(C++20) |
オブジェクトの範囲を未初期化メモリ領域にコピーする (アルゴリズム関数オブジェクト) |
(C++20) |
指定された個数のオブジェクトを未初期化メモリ領域にコピーする (アルゴリズム関数オブジェクト) |
(C++20) |
範囲で指定された未初期化メモリ領域にオブジェクトをコピーする (アルゴリズム関数オブジェクト) |
(C++20) |
開始位置と個数で指定された未初期化メモリ領域にオブジェクトをコピーする (アルゴリズム関数オブジェクト) |
(C++20) |
オブジェクトの範囲を未初期化メモリ領域にムーブする (アルゴリズム関数オブジェクト) |
(C++20) |
指定された個数のオブジェクトを未初期化メモリ領域にムーブする (アルゴリズム関数オブジェクト) |
| 範囲で指定された未初期化メモリ領域に デフォルト初期化 でオブジェクトを構築する (アルゴリズム関数オブジェクト) | |
| 開始位置と個数で指定された未初期化メモリ領域に デフォルト初期化 でオブジェクトを構築する (アルゴリズム関数オブジェクト) | |
| 範囲で指定された未初期化メモリ領域に 値初期化 でオブジェクトを構築する (アルゴリズム関数オブジェクト) | |
| 開始位置と個数で指定された未初期化メモリ領域に 値初期化 でオブジェクトを構築する (アルゴリズム関数オブジェクト) | |
オブジェクト(一括)破棄 | |
(C++20) |
範囲内のオブジェクトを破棄する (アルゴリズム関数オブジェクト) |
(C++20) |
範囲内の指定個数のオブジェクトを破棄する (アルゴリズム関数オブジェクト) |
(C++20) |
指定されたアドレスのオブジェクトを破棄する (アルゴリズム関数オブジェクト) |
特殊化された <random> アルゴリズム
ヘッダで定義
<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_parallel_algorithm |
202506L |
(C++26) | 並列範囲アルゴリズム |
__cpp_lib_ranges |
201911L |
(C++20) | Rangesライブラリ と 制約付きアルゴリズム |
__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 foldアルゴリズム
|
__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 | niebloidsは関数オブジェクト以外の特殊なエンティティとして指定することが許可されていた |
関数オブジェクトとして指定することが必須となった |