从std::nth_element的文档中我们有:
template< class RandomIt >
void nth_element( RandomIt first, RandomIt nth, RandomIt last );
按升序对范围[first,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
少之前两个数字,因为只有一个< / em>这样的号码。该算法尽力而为,输出符合要求:
1
2
2
3
2
我可以依靠这样好的行为吗?
我的实现(gcc 4.7)使用introselect算法。不幸的是我无法找到算法输入的要求。 introselect 是否需要所有值都不同?
答案 0 :(得分:13)
我认为,cppreference在这里是不正确的。以标准(N3337 25.4.2)获取战利品:
template<class RandomAccessIterator> void nth_element ( RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last );
...对于
i
范围内的任何迭代器[first,nth)
和任何迭代器j
它包含的范围[nth,last)
:!(*j < *i)
或comp(*j, *i) == false
。
因此,范围[first,nth)
中的元素将小于或等于范围[nth,last)
中的元素。
答案 1 :(得分:5)
Here是对std :: nth_element的更好定义:
以这样的方式重新排列[first,last]范围内的元素 第n个位置的元素就是那个元素 按排序顺序排列。
除了之外,其他元素没有任何特定顺序 nth之前的元素都不大于它,并且没有 其后的元素较少。
答案 2 :(得分:0)
不,它不等于或等于! nth_element随机选择其中一个值,这些值可能位于已排序数组的第n个位置。因为这将是第n个位置,所以没有办法,它可以将所有相等放在左侧,因为那时它将不再是第n个元素。测试一下!相等的值出现在第n个位置的两侧。