我在http://www.sgi.com/tech/stl/nth_element.html
阅读了std::nth_element
的说明
template <class RandomAccessIterator>
void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
RandomAccessIterator last);
请注意,先决条件是
我的问题是:
拨打std::nth_element(a.begin(), a.end(), a.end())
是否有效?如果是这样,它的影响是什么?无论如何,它并没有违反上述先决条件。语言标准(或其他文档)中的任何地方都声明nth
必须指向a
中的元素?
答案 0 :(得分:5)
它是有效的,并且可能,但不是标准的保证,是一个空操作。使用给定的数据,两个先决条件变为:
[a.begin(), a.end()) is a valid range.
[a.end(), a.end()) is a valid range.
这两个都是真的,但第二个间隔是空的。从标准25.3.2 / 1:
在nth_element之后,nth指向的位置中的元素是 如果对整个范围进行排序,则该元素将处于该位置。 也适用于[first,nth]范围内的任何迭代器和任何迭代器j 在[nth,last]范围内,它认为:!(* i&gt; * j)或comp(* j,* i)== 假的。
如果整个范围已排序,则原始a.end()
将位于a.end()
,而第二部分范围[nth, last)
为空,因此没有要评估{{1}的元素1}}和!(*i > *j)
条件。
答案 1 :(得分:0)
不,它无效,因为nth
必须在[first, last)
范围内。
答案 2 :(得分:0)
不,std::nth_element(a.begin(), a.end(), a.end())
无效 - 它违反了第二个前提条件,它要求nth
迭代器(第二个参数)指向有效元素。 a.end()
虽然没有指向有效的元素。