2012-06-28 12 views
7

leí la descripción de std::nth_element en http://www.sgi.com/tech/stl/nth_element.html¿Cuál es el efecto de std :: nth_element (a.begin(), a.end(), a.end())?

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

Tenga en cuenta que las condiciones previas son

  1. [primero, de orden n) es un rango válido.
  2. [enésimo, último lugar] es un rango válido.

Mi pregunta es:

¿Es válido para llamar std::nth_element(a.begin(), a.end(), a.end())? Si es así, ¿cuál es su efecto? No viola las condiciones previas arriba, de todos modos. En cualquier lugar del estándar de idioma (u otros documentos), se indicó que nth debe apuntar a un elemento en a?

+1

¿Por qué no lo pruebas y ves el efecto? –

+2

El resultado de una prueba no es confiable. Puede ser dependiente de la implementación. En realidad, me pregunto dónde se especifica este problema en el estándar de C++. – updogliu

+0

@updogliu El último texto estándar es sustancialmente el mismo que el de la página SGI que vinculó. – Potatoswatter

Respuesta

5

Es válido y probablemente, pero no está garantizado por la norma, una operación nula. Con los datos dados, las dos condiciones previas se convierten en:

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

Las dos son verdaderas; sin embargo, el segundo intervalo está vacío. De la norma 25.3.2/1:

Después nth_element el elemento en la posición apuntada por enésima es el elemento que estaría en esa posición si toda la gama se ordenaron. También para cualquier iterador i en el rango [primero, enésimo) y cualquier iterador j en el rango [enésimo, último] contiene que:! (* I> * j) o comp (* j, * i) == falso.

Si toda la gama se solucionó el original a.end() estaría en a.end() y para la segunda parte de la gama [nth, last) es vacía, así que no hay elementos para los que evaluar las condiciones !(*i > *j) y comp(*j, *i) == false.

+0

¿Algún razonamiento para apoyar la afirmación? – Potatoswatter

+0

@Potatoswatter Creo que me has ayudado a exponer mi caso en tu comentario sobre las otras respuestas. –

+2

Votación al cuadrado:^2. – Potatoswatter

0

No, no es válido porque nth tiene que estar dentro del rango [first, last).

+0

Gracias por editar, @Lucian. –

+0

¿Dónde se indica ese requisito? Dice que "el elemento señalado por el iterador nth es el mismo que el elemento que estaría en esa posición ..." pero ese requisito es simplemente nulo si no apunta a nada. – Potatoswatter

0

No, std::nth_element(a.begin(), a.end(), a.end()) no es válido; infringe la segunda condición previa, que requiere que el iterador nth (el segundo argumento) apunte a un elemento válido. a.end() no apunta a un elemento válido.

+1

Pero, todos los rangos en C++ están medio abiertos, y '[a, a)' siempre es un rango vacío. No hay un requisito claro de que 'nth' sea desreferenciable. – Potatoswatter

+0

Gracias, todavía estoy decidiendo si eliminar mi respuesta, pero todavía no estoy convencido de que esté mal :) –

+0

Potatoswatter dijo que mi principal preocupación. – updogliu

Cuestiones relacionadas