Из документации 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;
}
Алгоритм не может сделать оба числа перед middlePosition
меньше чем 2, поскольку существует только одно такое число. Алгоритм делает все возможное, и результат соответствует желаемому:
1
2
2
3
2
Могу ли я рассчитывать на такое хорошее поведение?
В моей реализации (gcc 4.7) используется алгоритм introselect. К сожалению, мне не удалось найти требования на вход алгоритма. Нужно ли introselect, чтобы все значения были разными?