类别:算法 | 组件类型:函数 |
template <class RandomAccessIterator> void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last); template <class RandomAccessIterator, class StrictWeakOrdering> void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, StrictWeakOrdering comp);
两个版本nth_element在如何定义一个元素是否小于另一个元素方面有所不同。第一个版本使用operator<比较对象,第二个版本使用 函数对象comp.
第一个版本的后置条件nth_element如下:范围内没有迭代器i使得[first, nth)*nth < *i,且没有迭代器j[nth + 1, last)使得*j < *nth*nth < *i第二个版本的后置条件.
comp(*nth, *i)nth_element如下:范围内没有迭代器i使得[first, nth)*nth < *i为真comp(*j, *nth)j[nth + 1, last)使得*j < *nth*nth < *i定义真comp(*j, *nth).
int A[] = {7, 2, 6, 11, 9, 3, 12, 10, 8, 4, 1, 5}; const int N = sizeof(A) / sizeof(int); nth_element(A, A + 6, A + N); copy(A, A + N, ostream_iterator<int>(cout, " ")); // The printed result is "5 2 6 1 4 3 7 8 9 10 11 12".
[1] 这与partial_sort不同的方式是范围[first, nth)和范围[nth, last)无序:仅保证[nth, last)中没有元素小于[first, nth)中的任何元素。在该意义上,nth_element更类似于partition而不是sort. Nth_element的工作量小于partial_sort,所以合理的来说,这一点更快。这是使用它的主要原因nth_element的替代partial_sort.
[2] 请注意,这明显低于partial_sort.