从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是否需要所有值都不同?