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

upd*_*liu 7 c++ stl

std::nth_elementhttp://www.sgi.com/tech/stl/nth_element.html上阅读了说明

template <class RandomAccessIterator>
void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
                 RandomAccessIterator last);
Run Code Online (Sandbox Code Playgroud)

请注意,前提条件是

  1. [first,nth]是有效范围.
  2. [nth,last)是有效范围.

我的问题是:

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

And*_*nck 5

它是有效的,可能,但不是由标准保证,null操作.使用给定的数据,两个前提条件变为:

[a.begin(), a.end()) is a valid range.
[a.end(), a.end()) is a valid range.
Run Code Online (Sandbox Code Playgroud)

这两个都是真的,但第二个间隔是空的.从标准25.3.2/1:

在nth_element之后,nth指向的位置中的元素是在整个范围被排序的情况下将处于该位置的元素.对于[first,nth]范围内的任何迭代器i和[nth,last]范围内的任何迭代器j,它都包含:!(*i>*j)或comp(*j,*i)== false.

如果对整个范围进行排序,则原始范围为第二部分a.end(),a.end()并且对于第二部分,范围[nth, last)为空,因此没有要评估条件!(*i > *j)comp(*j, *i) == false条件的元素.

  • 根据我对标准的理解,如果认为前提条件确实得到了满足,但是你有什么理由说明它是一个空操作?如果我们从字面上理解要求,在这种情况下,此函数可以自由地执行任何操作,包括对整个范围进行排序或随机化. (5认同)