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?
Respuesta
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.
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.
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.
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 .
- 1. ¿Cambiar el tamaño de un vector invalida los iteradores?
- 2. ¿Por qué push_back o push_front invalida los iteradores de un deque?
- 3. vector iteradores de reparto
- 4. std :: list <> :: splice invalida iteradores. ¿Razón fundamental?
- 5. ¿Por qué se invalida vector :: iterator en la reasignación?
- 6. ¿Cómo navegar a través de un vector usando iteradores? (C++)
- 7. ¿El incremento de un iterador de entrada mutable invalida los valores del iterador anterior?
- 8. Cómo aplanar los iteradores de contenedores anidados?
- 9. ¿Los contenedores que pasan por valor invalidan los iteradores?
- 10. ¿Cómo es * it ++ válido para los iteradores de salida?
- 11. ¿Invalida la fuente de mosaico MapView?
- 12. ¿Por qué C++ no se ocupa de los iteradores cuando la inserción se realiza en un vector una vez que se alcanza la capacidad?
- 13. devolver iteradores de C++
- 14. ¿Se optimizará la ineficacia de los operadores postfix ++/- para los iteradores STL?
- 15. ¿Memcache invalida las entradas según un patrón?
- 16. Uso correcto de los bloques iteradores
- 17. Aumente los iteradores de Property_Tree, cómo manejarlos?
- 18. Uso de la memoria de los iteradores en C#
- 19. ¿Cómo escribir un buscapersonas para los iteradores de Python?
- 20. ¿Cuál es la diferencia entre los iteradores de entrada y los iteradores de solo lectura hacia adelante?
- 21. ¿Hay alguna colección C# donde la modificación no invalide iteradores?
- 22. C# punteros, iteradores y genéricos
- 23. Borrando de un std :: vector mientras haces un para cada uno?
- 24. Comparar iteradores, C++
- 25. Inicializar std :: array con un rango (par de iteradores)
- 26. Un algoritmo de clasificación
- 27. Java swing: repaint() vs invalida
- 28. ¿Se pueden restablecer los iteradores en Python?
- 29. C++ Inicialización 2 iteradores diferentes en un bucle for
- 30. Iteradores entendimiento en la STL
Supongo que debería ser 'std :: vector :: iterator start'? –
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 ... –
@Ben, gracias, lo siento copiar y pegar mal! –