Constrained algorithms (since C++20)
C++20は名前空間
std::ranges
内のほとんどのアルゴリズムに対して
制約付き
版を提供します。これらのアルゴリズムでは、範囲は
イテレータ
-
センチネル
ペア、または単一の
range
引数として指定でき、射影とメンバへのポインタ呼び出し可能オブジェクトがサポートされます。さらに、ほとんどのアルゴリズムの
戻り値型
は、アルゴリズムの実行中に計算されたすべての潜在的に有用な情報を返すように変更されています。
目次 |
アルゴリズム関数オブジェクト
algorithm function object (AFO)、通称 niebloid は、 customization point object (CPO)の一種であり、1つ以上のオーバーロードされた関数テンプレートとして規定されます。これらの関数テンプレートの名前は、対応するアルゴリズム関数オブジェクトを指します。
アルゴリズム関数オブジェクト
o
に対して、
S
を対応する関数テンプレートの集合とする。このとき、任意の引数列
args...
に対して、
o
(
args...
)
は
式等価
である
s
(
args...
)
に、ここで
s
の名前探索の結果はオーバーロード集合
S
である。
std::ranges
名前空間内の制約付きアルゴリズムは、アルゴリズム関数オブジェクトとして定義されています。その結果:
- 明示的なテンプレート引数リストは、いずれかを呼び出す際に指定することはできません。
- いずれも 実引数依存の名前探索 では可視になりません。
- いずれかが関数呼び出し演算子の左側の名前として 通常の非修飾名前探索 によって見つかった場合、 実引数依存の名前探索 は抑制されます。
制約付きアルゴリズム
|
定義済みヘッダー
<algorithm>
|
|
|
名前空間
std::ranges
で定義
|
|
非変更シーケンス操作 |
|
|
(C++20)
(C++20)
(C++20)
|
述語が範囲内のすべての要素、いずれかの要素、またはいずれの要素に対しても
true
であるかどうかをチェックする
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
単項
function object
を
range
の要素に適用する
(algorithm function object) |
|
(C++20)
|
関数オブジェクトをシーケンスの最初のN個の要素に適用する
(アルゴリズム関数オブジェクト) |
|
(C++20)
(C++20)
|
特定の条件を満たす要素の数を返す
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
2つの範囲が最初に異なる位置を見つける
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
2つの要素の集合が同じかどうかを判定する
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
一方の範囲が他方よりも辞書順で小さい場合に
true
を返す
(アルゴリズム関数オブジェクト) |
|
(C++20)
(C++20)
(C++20)
|
特定の条件を満たす最初の要素を見つける
(アルゴリズム関数オブジェクト) |
|
(C++23)
(C++23)
(C++23)
|
特定の条件を満たす最後の要素を見つける
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
特定の範囲内で要素の最後のシーケンスを見つける
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
要素の集合のいずれかを検索する
(アルゴリズム関数オブジェクト) |
|
(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)
|
要素を二つのグループに分割し、それらの相対的な順序を保持する
(アルゴリズム関数オブジェクト) |
|
(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つの集合の積集合を計算する
(アルゴリズム関数オブジェクト) |
|
(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)
|
値を境界値のペアの間にクランプする
(アルゴリズム関数オブジェクト) |
順列操作 |
|
|
(C++20)
|
あるシーケンスが別のシーケンスの順列であるかどうかを判定する
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
要素の範囲の次のより大きい辞書順の順列を生成する
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
要素の範囲の次のより小さい辞書順の順列を生成する
(アルゴリズム関数オブジェクト) |
制約付き数値演算
|
ヘッダーで定義
<numeric>
|
|
|
名前空間で定義
std::ranges
|
|
|
(C++23)
|
範囲を開始値からの連続的な増分値で埋める
(アルゴリズム関数オブジェクト) |
制約付き畳み込み操作
|
ヘッダーで定義
<algorithm>
|
|
|
名前空間で定義
std::ranges
|
|
|
(C++23)
|
要素の範囲を左畳み込みする
(アルゴリズム関数オブジェクト) |
|
(C++23)
|
最初の要素を初期値として要素の範囲を左畳み込みする
(アルゴリズム関数オブジェクト) |
|
(C++23)
|
要素の範囲を右畳み込みする
(アルゴリズム関数オブジェクト) |
|
(C++23)
|
最後の要素を初期値として要素の範囲を右畳み込みする
(アルゴリズム関数オブジェクト) |
|
(C++23)
|
要素の範囲を左畳み込みし、
pair
(イテレータ, 値) を返す
(アルゴリズム関数オブジェクト) |
|
最初の要素を初期値として要素の範囲を左畳み込みし、
pair
(イテレータ,
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) | レンジライブラリ および 制約付きアルゴリズム |
__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 |
niebloidsは関数オブジェクト以外の特別なエンティティとして
指定可能であった |
関数オブジェクトとして指定することが要求される |