Из документации std:: nth_element мы имеем:
template< class RandomIt >
void nth_element( RandomIt first, RandomIt nth, RandomIt last );
Частично сортирует диапазон [первый, последний] в порядке возрастания, так что все элементы в диапазоне [first, nth] меньше, чем в диапазоне [nth, last).
Вещь, которая меня беспокоит, - это слово less. Разве это не должно быть меньше или равно? Если диапазон, например:
#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 для разных значений?