uso programacion mapas libreria funciona ejemplo diccionarios como c++ sorting stl

programacion - setw c++ ejemplo



¿Un orden de vectores invalida los iteradores? (4)

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?


Según la norma C ++ §23.1 / 11:

A menos que se especifique lo contrario (ya sea explícitamente o definiendo una función en términos de otras funciones), invocar una función de miembro de contenedor o pasar un contenedor como un argumento a una función de biblioteca no invalidará los iteradores de, o cambiará los valores de, objetos dentro de ese contenedor .

§25.3 "Clasificación y operaciones relacionadas" no especifica que los iteradores se invalidarán, por lo que los iteradores en la pregunta deben permanecer válidos.


Todavía apuntan al principio y al final. Los valores en esas ranuras del vector probablemente han cambiado, pero la ubicación de almacenamiento en la que reside cada uno permanece igual.


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

En resumen,

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

Además del soporte para el estándar proporcionado por Kirill V. Lyadvinsky ( ¿El orden de vectores invalida los iteradores? ):

  • 25/5 "biblioteca de algoritmos"

Si la sección de Efectos de un algoritmo dice que un valor señalado por cualquier iterador pasado como un argumento se modifica, entonces ese algoritmo tiene un requisito de tipo adicional: El tipo de ese argumento deberá satisfacer los requisitos de un iterador mutable (24.1).

  • 24.1 / 4 "Requisitos del iterador"

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


std::vector mantiene sus elementos en la memoria contigua. std::sort toma argumentos (iteradores) por valor y reordena la secuencia entre ellos. El resultado neto es que las variables locales, start y end , siguen apuntando a los elementos primero y uno-pasado-último-último del vector.