7

http://www.sgi.com/tech/stl/nth_element.htmlstd::nth_elementでの説明を読みました

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

前提条件は次のとおりです。

  1. [first、nth)は有効な範囲です。
  2. [n番目、最後)は有効な範囲です。

私の質問は:

電話をかけることは有効ですstd::nth_element(a.begin(), a.end(), a.end())か?もしそうなら、その効果は何ですか?とにかく、それは上記の前提条件に違反しません。言語標準(または他のドキュメント)のどこでも、 ?nthの要素を指している必要があると述べられています。a

4

3 に答える 3

5

これは有効であり、おそらく、標準ではnull操作であることが保証されていません。与えられたデータでは、2つの前提条件は次のようになります。

[a.begin(), a.end()) is a valid range.
[a.end(), a.end()) is a valid range.

どちらも正しいですが、2番目の間隔は空です。標準25.3.2/1から:

nth_elementの後、nthが指す位置にある要素は、範囲全体がソートされた場合にその位置にある要素です。また、範囲[first、nth)のイテレータiおよび範囲[nth、last)のイテレータjについては、!(* i> * j)またはcomp(* j、* i)==falseとなります。

範囲全体がソートされた場合、元の値a.end()はになりa.end()、2番目の部分では範囲が空になるため、条件[nth, last)を評価する要素はありません。!(*i > *j)comp(*j, *i) == false

于 2012-06-28T13:11:21.037 に答える
0

いいえ、nth範囲内である必要があるため、無効です[first, last)

于 2012-06-28T13:10:31.383 に答える
0

いいえ、無効です-イテレータ(2番目の引数)が有効な要素を指しているstd::nth_element(a.begin(), a.end(), a.end())必要がある2番目の前提条件に違反しています。ただし、有効な要素を指していません。ntha.end()

于 2012-06-28T13:14:15.250 に答える