std::nth_elementのドキュメントから、次のものがあります。
template< class RandomIt >
void nth_element( RandomIt first, RandomIt nth, RandomIt last );
範囲 [first, last) を部分的に昇順に並べ替え、範囲 [first, nth) 内のすべての要素が範囲 [nth, last) 内の要素より小さくなるようにします。
私を悩ませているのは、言葉が少ないことです。それ以下であるべきではありませんか?たとえば、範囲が次の場合:
#include <algorithm>
#include <vector>
#include <iostream>
int main()
{
std::vector<int> numbers = {3, 2, 2, 2, 1};
auto middlePosition = numbers.begin() + 2;
std::nth_element(numbers.begin(), middlePosition, numbers.end());
for (int x : numbers)
std::cout << x << std::endl;
return 0;
}
このような数は1 つしかないため、アルゴリズムは 2未満の数の前に両方の数を作成することはできません。アルゴリズムは最善を尽くし、出力は希望どおりです。middlePosition
1
2
2
3
2
このような素敵な振る舞いに頼ることができますか?
私の実装 (gcc 4.7) はintroselectアルゴリズムを使用しています。残念ながら、アルゴリズムの入力に関する要件が見つかりませんでした。introselectはすべての値を異なるものにする必要がありますか?