std :: nth_element(a.begin(),a.end(),a.end())有什么影响?

时间:2012-06-28 13:07:44

标签: c++ stl

我在http://www.sgi.com/tech/stl/nth_element.html

阅读了std::nth_element的说明
template <class RandomAccessIterator>
void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
                 RandomAccessIterator last);

请注意,先决条件是

  1. [first,nth]是有效范围。
  2. [nth,last)是有效范围。
  3. 我的问题是:

    拨打std::nth_element(a.begin(), a.end(), a.end())是否有效?如果是这样,它的影响是什么?无论如何,它并没有违反上述先决条件。语言标准(或其他文档)中的任何地方都声明nth必须指向a中的元素?

3 个答案:

答案 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()虽然没有指向有效的元素。