std::nth_element
ヘッダ <algorithm> で定義 | ||
(1) | ||
template<class RandomIt > void nth_element( RandomIt first, RandomIt nth, RandomIt last ); | (C++20未満) | |
template<class RandomIt > constexprvoid nth_element( RandomIt first, RandomIt nth, RandomIt last ); | (C++20以上) | |
template<class ExecutionPolicy, class RandomIt > void nth_element( ExecutionPolicy&& policy, | (2) | (C++17以上) |
(3) | ||
template<class RandomIt, class Compare > void nth_element( RandomIt first, RandomIt nth, RandomIt last, | (C++20未満) | |
template<class RandomIt, class Compare > constexprvoid nth_element( RandomIt first, RandomIt nth, RandomIt last, | (C++20以上) | |
template<class ExecutionPolicy, class RandomIt, class Compare > void nth_element( ExecutionPolicy&& policy, | (4) | (C++17以上) |
nth_element
は以下のように [first, last)
内の要素を並べ替える部分ソートアルゴリズムです。
nth
の指す要素は、もし[first, last)
がソートされたならばその位置に現れたであろう要素に変更されます。- この新しい
nth
要素より前のすべての要素は、その新しいnth
要素より後の要素より小さいまたは等しくなります。
より形式的に言うと、 nth_element
は、範囲 [first, nth)
内の任意の i
および範囲 [nth, last)
内の任意の j
について、 !(*j <*i)((1-2) の場合) または comp(*j, *i)==false ((3-4) の場合) が成立するように、範囲 [first, last)
を昇順に部分的にソートします。 位置 nth
に置かれる要素は、もし範囲が完全にソートされたならばちょうどその位置に現れたであろう要素になります。
nth
は終端イテレータであっても構いません。 その場合、この関数は効果を持ちません。
operator<
を用いて比較されます。comp
を用いて比較されます。policy
に従って実行されます。 これらのオーバーロードは、 std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> が true でなければ、オーバーロード解決に参加しません。目次 |
[編集]引数
first, last | - | ソートする範囲を定義するランダムアクセスイテレータ |
nth | - | ソートの分割点を定義するランダムアクセスイテレータ |
policy | - | 使用する実行ポリシー。 詳細は実行ポリシーを参照してください |
comp | - | 最初の要素が2番目の要素より小さい (前に順序づけられる) 場合に true を返す、比較関数オブジェクト (Compare の要件を満たすオブジェクト)。 比較関数のシグネチャは以下と同等なものであるべきです。 bool cmp(const Type1 &a, const Type2 &b); シグネチャが const& を持つ必要はありませんが、関数は渡されたオブジェクトを変更してはならず、 |
型の要件 | ||
-RandomIt は ValueSwappable および LegacyRandomAccessIterator の要件を満たさなければなりません。 | ||
-RandomIt を逆参照した型は MoveAssignable および MoveConstructible の要件を満たさなければなりません。 |
[編集]戻り値
(なし)
[編集]計算量
[編集]例外
テンプレート引数 ExecutionPolicy
を持つオーバーロードは以下のようにエラーを報告します。
- アルゴリズムの一部として呼び出された関数の実行が例外を投げ、
ExecutionPolicy
が標準のポリシーのいずれかの場合は、 std::terminate が呼ばれます。 それ以外のあらゆるExecutionPolicy
については、動作は処理系定義です。 - アルゴリズムがメモリの確保に失敗した場合は、 std::bad_alloc が投げられます。
[編集]ノート
使用されるアルゴリズムは、一般的にはイントロセレクトですが、平均的なケースの計算量が適切な他の選択アルゴリズムも許されます。
[編集]例
#include <iostream>#include <vector>#include <algorithm>#include <functional> int main(){std::vector<int> v{5, 6, 4, 3, 2, 6, 7, 9, 3}; std::nth_element(v.begin(), v.begin()+ v.size()/2, v.end());std::cout<<"The median is "<< v[v.size()/2]<<'\n'; std::nth_element(v.begin(), v.begin()+1, v.end(), std::greater<int>());std::cout<<"The second largest element is "<< v[1]<<'\n';}
出力:
The median is 5 The second largest element is 7
[編集]関連項目
指定範囲の最初の N 個の要素がソートされたコピーを作成します (関数テンプレート) | |
等しい要素間の順序を維持しながら指定範囲の要素をソートします (関数テンプレート) | |
指定範囲を昇順にソートします (関数テンプレート) |