c – std :: nth_element(a.begin(),a.end(),a.end())的效果是什么?

前端之家收集整理的这篇文章主要介绍了c – std :: nth_element(a.begin(),a.end(),a.end())的效果是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 http://www.sgi.com/tech/stl/nth_element.html读到了std :: nth_element的描述
template <class RandomAccessIterator>
void nth_element(RandomAccessIterator first,RandomAccessIterator nth,RandomAccessIterator last);

请注意,前提条件是

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

我的问题是:

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

解决方法

它是有效的,可能,但不是标准的保证,null操作.使用给定的数据,两个前提条件变为:
[a.begin(),a.end()) is a valid range.
[a.end(),a.end()) is a valid range.

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

After nth_element the element in the position pointed to by nth is the
element that would be in that position if the whole range were sorted.
Also for any iterator i in the range [first,nth) and any iterator j
in the range [nth,last) it holds that: !(*i > *j) or comp(*j,*i) ==
false.

如果整个范围被排序,原始a.end()将在a.end(),而对于第二部分,范围[nth,last)是空的,因此没有要评估的元素!(* i> ; * j)和comp(* j,* i)==错误的条件.

猜你在找的C&C++相关文章