Я смотрел на алгоритм std:: nth_element, который, по-видимому:
Переупорядочивает элементы в диапазоне [первый, последний], таким образом, чтобы элемент на полученной n-й позиции является элементом, который будет в этом положении в отсортированной последовательности, причем ни один из элементов предшествующий ему, больше, и ни один из элементов, следующих за ним меньше. Ни предшествующие ему элементы, ни элементы после этого гарантируется, что они будут заказаны.
Однако с моим компилятором выполняется следующее:
vector<int> myvector;
srand(GetTickCount());
// set some values:
for ( int i = 0; i < 10; i++ )
myvector.push_back(rand());
// nth_element around the 4th element
nth_element (myvector.begin(), myvector.begin()+4, myvector.end());
// print results
for (auto it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;
cout << endl;
Всегда возвращает полностью отсортированный список целых чисел точно так же, как и std:: sort. Я что-то упускаю? Для чего этот алгоритм полезен?
РЕДАКТИРОВАТЬ: Ok, следующий пример с использованием гораздо большего набора показывает, что существует большая разница:
vector<int> myvector;
srand(GetTickCount());
// set some values:
for ( int i = 0; i < RAND_MAX; i++ )
myvector.push_back(rand());
// nth_element around the 4th element
nth_element (myvector.begin(), myvector.begin()+rand(), myvector.end());
vector<int> copy = myvector;
std::sort(myvector.begin(), myvector.end());
cout << (myvector == copy ? "true" : "false") << endl;