2012-06-28 3 views
7

я прочитал описание std::nth_element на http://www.sgi.com/tech/stl/nth_element.htmlКаков эффект std :: nth_element (a.begin(), a.end(), a.end())?

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

Обратите внимание, что предпосылки

  1. [во-первых, п-й) является допустимым диапазоном.
  2. [nth, last) - допустимый диапазон.

Мой вопрос:

Справедливо ли называть std::nth_element(a.begin(), a.end(), a.end())? Если да, то каков его эффект? Во всяком случае, это не нарушает предварительных условий. В любом месте в стандарте языка (или других документах) указано, что nth должен указывать на элемент в a?

+1

Почему бы вам просто не попробовать и не увидеть эффект. –

+2

Результат попытки не является надежным. Это может быть зависимым от реализации. На самом деле мне интересно, где эта проблема указана в стандарте C++. – updogliu

+0

@updogliu Последний стандартный текст по существу совпадает с страницей SGI, с которой вы связаны. – Potatoswatter

ответ

5

Это действительный и, вероятно, не гарантируется стандартом, нулевая операция. С учетом данных данных двух предварительных условий становятся следующими:

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

И то, и другое верно, второй интервал пуст. Из стандартного 25.3.2/1:

После того, как nth_element элемент в положении, на который указывает п-го является элемент, который был бы в этом положении, если весь диапазон были отсортированы. Также для любого итератора i в диапазоне [first, nth) и любого итератора j в диапазоне [nth, last] он содержит:! (* I> * j) или comp (* j, * i) == false.

Если весь диапазон был отсортирован оригинальный a.end() будет в a.end() и во второй части диапазона [nth, last) пуст, так что нет никаких элементов, для которых оценить !(*i > *j) и comp(*j, *i) == false условия.

+0

Любые аргументы в поддержку утверждения? – Potatoswatter

+0

@Potatoswatter Я думаю, вы помогли мне сделать мое дело в комментарии к другим ответам. –

+2

Скважина в квадрате:^2. – Potatoswatter

0

Нет, это недействительно, так как nth должно быть в пределах [first, last).

+0

Спасибо за редактирование @Lucian. –

+0

Где указано это требование? В нем говорится, что «элемент, на который указывает итератор nth, совпадает с элементом, который будет в этой позиции ...», но это требование просто равно нулю, если оно не указывает на что-либо. – Potatoswatter

0

Нет, std::nth_element(a.begin(), a.end(), a.end()) недействителен - он нарушает второе предварительное условие, которое требует, чтобы итератор nth (второй аргумент) указывал на действительный элемент. a.end() не указывает на действительный элемент.

+1

Но все диапазоны в C++ являются полуоткрытыми, а '[a, a)' всегда является пустым диапазоном. Нет четкого требования, чтобы «nth» было разыменованным. – Potatoswatter

+0

Спасибо, я все еще решаю, удалить ли мой ответ, но я все еще не убежден, что это неправильно :) –

+0

Potatoswatter сказал, что моя главная забота. – updogliu

Смежные вопросы