7

我阅读了std::nth_elementhttp://www.sgi.com/tech/stl/nth_element.html上的描述

template <class RandomAccessIterator>
void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
                 RandomAccessIterator last);

请注意,前提条件是

  1. [first, nth) 是一个有效范围。
  2. [nth, last) 是一个有效范围。

我的问题是:

打电话有效std::nth_element(a.begin(), a.end(), a.end())吗?如果有,它的作用是什么?无论如何,它不违反上述先决条件。语言标准(或其他文件)中的任何地方都指出nth必须指向a?

4

3 回答 3

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) 中的任何迭代器 i 和范围 [nth, last) 中的任何迭代器 j,它都认为:!(*i > *j) 或 comp(*j, *i) == false。

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

于 2012-06-28T13:11:21.037 回答
0

不,它无效,因为nth必须在范围内[first, last)

于 2012-06-28T13:10:31.383 回答
0

不,std::nth_element(a.begin(), a.end(), a.end())无效 - 它违反了第二个前提条件,即要求nth迭代器(第二个参数)指向一个有效元素。a.end()虽然没有指向一个有效的元素。

于 2012-06-28T13:14:15.250 回答