<algorithm>
アルゴリズムを実行する C++ 標準ライブラリ コンテナーのテンプレート関数を定義します。
構文
(see links below for specific algorithm syntax)
Note
<algorithm>
ライブラリでは、#include <initializer_list>
ステートメントも使用されます。
解説
C++ 標準ライブラリ アルゴリズムは、さまざまなデータ構造で動作できます。 操作できるデータ構造には、 vector
や list
などの C++ 標準ライブラリ コンテナー クラスだけでなく、特定のアルゴリズムの要件を満たしている限り、ユーザー定義のデータ構造と要素の配列も含まれます。 C++ 標準ライブラリ アルゴリズムは、反復子によって間接的にコンテナー要素にアクセスし、走査することによって、このレベルの一般性を実現します。
C++ 標準ライブラリ アルゴリズムは、通常、開始位置または終了位置によって指定される反復子範囲を処理します。 参照される範囲は、範囲内のすべての反復子が逆参照可能でなければならないという意味で有効である必要があります。また、各範囲のシーケンス内では、反復子をインクリメントすることによって、最初の位置から最後の位置に到達できる必要があります。
C++20 以降では、 <algorithm>
で定義されているアルゴリズムのほとんどは、 range
を受け取る形式でも使用できます。 たとえば、 sort(v1.begin(), v1.end(), greater<int>());
を呼び出す代わりに、 ranges::sort(v1, greater<int>());
C++ 標準ライブラリ アルゴリズムは、さまざまな種類のコンテナー オブジェクトを同時に操作できます。 アルゴリズムの目的に関する情報を伝えるために、次の 2 つのサフィックスが使用されています。
_if
サフィックスは、要素自体ではなく、要素の値を操作する関数オブジェクトでアルゴリズムが使用されることを示します。 たとえば、find_if
アルゴリズムでは、関数オブジェクトで指定された条件を満たす値を持つ要素が検索されますが、find
アルゴリズムでは特定の値が検索されます。_copy
サフィックスは、アルゴリズムが通常、変更された値をコピーするのではなく、コピーされた値を変更することを示します。 つまり、ソース範囲の要素は変更せず、結果を出力範囲/反復子に配置します。 たとえば、reverse
アルゴリズムは範囲内の要素の順序を逆にし、reverse_copy
アルゴリズムは反転した結果をコピー先の範囲にコピーします。
C++ 標準ライブラリ アルゴリズムは、多くの場合、目的または要件を示すためにグループに分類されます。 これには、要素の値を変更する変更アルゴリズムと、変更されない非変更アルゴリズムの比較が含まれます。 変換アルゴリズムは、要素の順序を変更しますが、要素の値は変更しません。 削除アルゴリズムは、範囲または範囲のコピーから要素を除去できます。 並べ替えアルゴリズムは、さまざまな方法で要素の順序を変更し、並べ替えられた範囲アルゴリズムは、要素が特定の方法で並べ替えられた範囲に対してのみ機能します。
数値処理用に提供される C++ 標準ライブラリ数値アルゴリズムには独自のヘッダー ファイル <numeric>
があり、関数オブジェクトとアダプターはヘッダー <functional>
で定義されます。 ブール値を返す関数オブジェクトは述語と呼ばれます。 既定の二項述語は比較 operator<
です。 一般に、並べ替えられる要素は、2 つの要素を考えると、同等 (どちらも他の要素より小さいという意味) か、一方が他方より小さいかを判断できるように、比較対象の要素よりも小さい必要があります。 この結果、等価でない複数の要素間で順序が付けられます。
アルゴリズム
名前 | 説明 |
---|---|
adjacent_find |
等しいか、または指定された条件を満たす 2 個の隣接する要素を検索します。 |
all_of |
特定の範囲内の各要素について条件が存在するときに、true を返します。 |
any_of |
指定された要素の範囲内で条件が少なくとも 1 回存在するときに、true を返します。 |
binary_search |
並べ替えられた範囲に、指定された値と等しい要素が存在するか、または二項述語で指定された意味で、指定された値と等価の要素が存在するかどうかをテストします。 |
clamp |
|
copy |
要素のソース シーケンス全体を繰り返し、順方向の新しい位置を割り当てて、ソース範囲内からターゲットの範囲に要素の値を割り当てます。 |
copy_backward |
要素のソース シーケンス全体を繰り返し、逆方向の新しい位置を割り当てて、ソース範囲内からターゲットの範囲に要素の値を割り当てます。 |
copy_if |
特定の範囲内で指定された条件が true であるすべての要素をコピーします。 |
copy_n |
指定された数の要素をコピーします。 |
count |
範囲内で値が指定された値と一致する要素の数を返します。 |
count_if |
範囲内で値が指定された条件と一致する要素の数を返します。 |
equal |
二項述語によって指定された等値または等価について、2 つの範囲を要素ごとに比較します。 |
equal_range |
順序付けられた範囲内で、最初の位置が指定された要素の位置以下で、2 番目の位置が要素の位置を超える位置のペアを検索します。ここで、シーケンス内の位置を確立するために使用される等価または順序付けの意味は、二項述語によって指定できます。 |
fill |
指定された範囲のすべての要素に同じ新しい値を割り当てます。 |
fill_n |
特定の要素で始まる要素範囲で、指定された数の要素に新しい値を割り当てます。 |
find |
範囲内で指定された値を持つ要素が最初に出現する位置を検索します。 |
find_end |
範囲内で指定されたシーケンスと等しい、つまり二項述語で指定された意味で等価である最後のサブシーケンスを検索します。 |
find_first_of |
対象範囲内で複数の値のうち最初に出現するもの、つまり二項述語で指定された意味で、指定された要素のセットと等価である複数の要素のうち最初に出現するものを検索します。 |
find_if |
範囲内で指定された条件を満たす要素が最初に出現する位置を検索します。 |
find_if_not |
条件を満たさない指定範囲の最初の要素を返します。 |
for_each |
範囲内で順方向順序で各要素に対して指定された関数を適用し、関数オブジェクトを返します。 |
for_each_n |
|
generate |
範囲内の各要素に関数オブジェクトによって生成される値を割り当てます。 |
generate_n |
範囲内の指定された数の要素に関数オブジェクトによって生成される値を割り当て、最後に割り当てられた値を 1 つ超えた位置を返します。 |
includes |
1 つの並べ替えられた範囲に、別の並べ替えられた範囲内のすべての要素が含まれるかどうかをテストします。要素間の順序または等価の基準は二項述語によって指定できます。 |
inplace_merge |
2 つの連続する並べ替えられた範囲の要素を単一の並べ替えられた範囲として連結します。順序の基準は二項述語によって指定できます。 |
is_heap |
指定された範囲の要素がヒープを形成する場合は true を返します。 |
is_heap_until |
指定された範囲が最後の要素までヒープを形成する場合は true を返します。 |
is_partitioned |
特定の範囲で条件が true になるすべての要素が、true になる要素の前にある場合は、false を返します。 |
is_permutation |
特定の範囲の要素が有効な順列を形成するかどうかを決定します。 |
is_sorted |
指定された範囲の要素が並べ替えられた順序になっている場合は true を返します。 |
is_sorted_until |
指定された範囲の要素が並べ替えられた順序になっている場合は true を返します。 |
iter_swap |
指定された反復子のペアで参照される 2 個の値を交換します。 |
lexicographical_compare |
2 つのシーケンスを要素ごとに比較して、2 つのうちどちらが小さいかを判断します。 |
lower_bound |
順序の基準が二項述語で指定できる場合に、順序付けられた範囲内で、指定した値と等価以上の値を持つ最初の要素の位置を検索します。 |
make_heap |
指定された範囲の要素を、最初の要素が最大であるヒープに変換します。並べ替えの基準は二項述語によって指定できます。 |
max |
2 つのオブジェクトを比較し、大きい方のオブジェクトを返します。順序の基準は、二項述語によって指定できます。 |
max_element |
並べ替え基準をバイナリ述語で指定できる、指定された範囲内の最大の要素の最初の出現箇所を検索します。 |
merge |
2 つの並べ替えられたソース範囲のすべての要素を単一の並べ替えられたターゲット範囲として連結します。順序の基準は二項述語によって指定できます。 |
min |
2 つのオブジェクトを比較し、小さい方のオブジェクトを返します。順序の基準は、二項述語によって指定できます。 |
min_element |
指定された範囲内の最小の要素の最初の出現箇所を検索します。順序の基準は二項述語によって指定できます。 |
minmax |
2 つの入力パラメーターを比較し、それらを昇順のペアとして返します。 |
minmax_element |
min_element と max_element によって実行される作業を 1 回の呼び出しで実行します。 |
mismatch |
二項述語によって指定された等値または等価について、2 つの範囲を要素ごとに比較し、相違点が発生する最初の位置を検索します。 |
<alg> move |
指定された範囲に関連付けられている要素を移動します。 |
move_backward |
ある反復子の要素を別の反復子に移動します。 移動は、指定した範囲の最後の要素から開始され、その範囲内の先頭の要素で終了します。 |
next_permutation |
範囲内の要素の順序を変更し、元の順序を辞書式に次に大きい順列 (存在する場合) に置き換えます。next の意味は二項述語によって指定できます。 |
none_of |
特定の範囲内の要素について条件が存在しないときに、true を返します。 |
nth_element |
範囲内のシーケンスの n 番目の要素を正しく検索し、その要素の前にあるすべての要素がその要素以下、シーケンス内でその要素に続くすべての要素がその要素以上になるようにして、要素の範囲を分割します。 |
partial_sort |
範囲内で指定された数の、より小さい要素を、降順以外の順序、または二項述語で指定された順序の基準に従って配置します。 |
partial_sort_copy |
ソース範囲からターゲット範囲に要素をコピーします。ソース要素は小なりまたは指定された別の二項述語によって並べ替えられます。 |
partition |
範囲内の要素を 2 つの分離されたセットに分類し、単項述語を満たす要素が単項述語を満たさない要素よりも前に来るように配置します。 |
partition_copy |
条件が true である要素を 1 つターゲットにコピーし、条件が false である要素を別のターゲットにコピーします。 要素は指定された範囲に含まれている必要があります。 |
partition_point |
条件を満たさない、指定された範囲内の最初の要素を返します。 要素は、条件を満たす要素が、満たされていない要素の前に来るように並べ替えられます。 |
pop_heap |
ヒープの先頭と範囲内の最後から 2 番目の位置との間で最大の要素を削除し、残りの要素から新しいヒープを形成します。 |
prev_permutation |
範囲内の要素の順序を変更し、元の順序を辞書式に次に大きい順列 (存在する場合) に置き換えます。next の意味は二項述語によって指定できます。 |
push_heap |
範囲の末尾にある要素を、範囲内の以前の要素で構成される既存のヒープに追加します。 |
random_shuffle |
範囲内の N 個の要素のシーケンスを、ランダムに選択された N! 個の可能な配置の 1 つに再配置します。 |
remove |
特定の範囲から指定された値を除去します。残りの要素の順序に影響を及ぼすことはなく、指定された値を含まない新しい範囲の末尾を返します。 |
remove_copy |
指定した値の要素がコピーされない点を除き、ソース範囲からコピー先の範囲に要素をコピーします。ただし、残りの要素の順序を乱し、新しいコピー先範囲の末尾を返す必要はありません。 |
remove_copy_if |
コピー元の範囲からコピー先の範囲に要素をコピーします。ただし、述語を満たす要素はコピーされません。ただし、残りの要素の順序を乱し、新しいコピー先範囲の末尾を返す必要はありません。 |
remove_if |
特定の範囲から述語を満たす要素を除去します。残りの要素の順序に影響を及ぼすことはなく、指定された値を含まない新しい範囲の末尾を返します。 |
replace |
範囲内の各要素が指定された値に一致するかどうかを調べ、一致する場合は置き換えます。 |
replace_copy |
ソース範囲内の各要素が指定された値に一致するかどうかを調べ、一致する場合は置き換えて結果を新しいターゲット範囲にコピーします。 |
replace_copy_if |
ソース範囲内の各要素が指定された述語を満たすかどうかを調べ、満たす場合は置き換えて結果を新しいターゲット範囲にコピーします。 |
replace_if |
範囲内の各要素が指定された述語を満たすかどうかを調べ、満たす場合は置き換えます。 |
reverse |
範囲内の要素の順序を反転させます。 |
reverse_copy |
ソース範囲内の要素の順序を反転し、結果をターゲット範囲にコピーします。 |
rotate |
2 つの隣接する範囲の要素を交換します。 |
rotate_copy |
ソース範囲内の 2 つの隣接する範囲の要素を交換し、結果をターゲット範囲にコピーします。 |
sample |
|
search |
要素が特定の要素シーケンス内の要素と等しいか、または要素が二項述語で指定される意味において特定のシーケンス内の要素と等価であるシーケンスが、対象範囲内で最初に出現する位置を検索します。 |
search_n |
特定の値を持つか、二項述語によって指定される値と関連する、指定された数の要素で構成される範囲内の最初のサブシーケンスを検索します。 |
set_difference |
1 つの並べ替えられたソース範囲内に属するが、2 番目の並べ替えられたソース範囲には属さないすべての要素を単一の並べ替えられたターゲット範囲として結合します。順序の基準は二項述語によって指定できます。 |
set_intersection |
両方の並べ替えられたソース範囲に属するすべての要素を単一の並べ替えられたターゲット範囲として結合します。順序の基準は二項述語によって指定できます。 |
set_symmetric_difference |
並べ替えられたソース範囲の一方には属するが、両方には属さないすべての要素を単一の並べ替えられたターゲット範囲として結合します。順序の基準は二項述語によって指定できます。 |
set_union |
2 つの並べ替えられたソース範囲の少なくとも一方に属するすべての要素を単一の並べ替えられたターゲット範囲として結合します。順序の基準は二項述語によって指定できます。 |
sort |
指定された範囲の要素を、降順以外の順序、または二項述語で指定された順序の基準に従って配置します。 |
shuffle |
乱数ジェネレーターを使用して、指定の範囲の要素をシャッフル (並べ替え) します。 |
sort_heap |
ヒープを並べ替えられた範囲に変換します。 |
stable_partition |
範囲内の要素を 2 つの分離されたセットに分類し、等価要素の相対順序は維持して、単項述語を満たす要素が単項述語を満たさない要素よりも前に来るように配置します。 |
stable_sort |
指定された範囲の要素を、降順以外の順序、または二項述語で指定された順序の基準に従って、等価要素の相対順序を維持して配置します。 |
swap |
2 種類のオブジェクトの間で、最初のオブジェクトの内容を 2 番目のオブジェクトに割り当て、2 番目のオブジェクトの内容を最初のオブジェクトに割り当てて、要素の値を交換します。 |
swap_ranges |
1 つの範囲の要素を、同じサイズの別の範囲の要素と交換します。 |
transform |
指定された関数オブジェクトをソース範囲内の各要素、または 2 つのソース範囲内の要素のペアに適用し、関数オブジェクトの戻り値をターゲット範囲にコピーします。 |
unique |
指定した範囲内の互いに隣接する重複する要素を削除します。 |
unique_copy |
相互に隣接する重複する要素を除き、ソース範囲からコピー先の範囲に要素をコピーします。 |
upper_bound |
順序の基準が二項述語で指定できる場合に、順序付けられた範囲内で、指定した値を超える値を持つ最初の要素の位置を検索します。 |