2010-10-07 7 views
20
std::vector<string> names; 
std::vector<string>::iterator start = names.begin(); 
std::vector<string>::iterator end = names.end(); 
sort (start,end); 
//are my start and end valid at this point? 
//or they do not point to front and tail resp? 
+0

Supongo que debería ser 'std :: vector :: iterator start'? –

+1

Incluso si es cierto, el desarrollador que viene después perderá un día tratando de demostrar que esta es la causa raíz de algún error que está solucionando ... –

+0

@Ben, gracias, lo siento copiar y pegar mal! –

Respuesta

18

Según el C++ estándar § 23,1/11:

A menos que se especifique otra cosa (ya sea explícitamente o mediante la definición de una función en términos de otras funciones), invocando una función miembro contenedor o pasando un recipiente como argumento al una función de biblioteca no invalidará iteradores, ni cambiará los valores de los objetos dentro de ese contenedor.

§ 25,3 "Clasificación y las operaciones conexas" no especifica que serán invalidados iteradores, por lo iteradores en la cuestión deben permanecer válida.

11

Todavía apuntan al principio y al final. Es probable que los valores en esas ranuras del vector hayan cambiado, pero la ubicación de almacenamiento en la que cada uno reside sigue siendo la misma.

1

std::vector mantiene sus elementos en la memoria contigua. std::sort toma argumentos (iteradores) por valor y reorganiza la secuencia entre ellos. El resultado neto es que las variables locales start y end todavía apuntan al primer elemento y al último elemento del vector.

6

std::sort no invalidará los iteradores en un vector. La plantilla de clasificación utiliza el operador * en los iteradores para acceder y modificar los contenidos del vector, y modificar un elemento vectorial a través de un iterador en un elemento que ya está en el vector no invalidará ningún iterador.

En resumen,

  • sus iteradores existentes no serán invalidados embargo
  • , los elementos a los que apuntan pueden haber sido modificados

Además de la compatibilidad con el estándar proporcionado por Kirill V. Lyadvinsky (Does a vector sort invalidate iterators?):

  • 25/5 "Algorit biblioteca HMS"

Si la sección Efectos de un algoritmo dice que un valor apuntado por cualquier iterador se pasa como un argumento es modificada, a continuación, que el algoritmo tiene una requisito tipo adicional: El tipo de ese El argumento debe cumplir los requisitos de un iterador mutable (24.1).

  • 24.1/4 "requisitos" Iterator

Además de su categoría, un delantero, bidireccionales o de acceso aleatorio iterador también puede ser mutable o constante en función de si el resultado de la expresión * i se comporta como una referencia o como referencia a una constante .

Cuestiones relacionadas