example c++ stl iterator deque

example - Deque de C++: cuando los iteradores son invalidados



deque java (1)

Por favor, corríjame si estoy equivocado. ¡Gracias!

insert y erase reubicará elementos, pero los elementos antes de la posición donde se realiza la inserción / eliminación no se reubican y, por lo tanto, sus iteradores siguen siendo válidos.

push_back y pop_back no invalidan ningún iterador.

push_front y pop_front invalidan todos los iteradores.

swap no reubicará elementos, pero de alguna manera creo que debería invalidar los iteradores.


push_back() y push_front() se definen en términos de insert() . De manera similar, pop_back() y pop_front() se definen en términos de erase() .

Esto es lo que dice el estándar C ++ 03 sobre la invalidación del iterador para insert() (23.2.1.3/1):

Una inserción en el medio del deque invalida todos los iteradores y referencias a los elementos del deque. Una inserción en cada extremo del deque invalida todos los iteradores del deque, pero no tiene efecto en la validez de las referencias a los elementos del deque.

Por push_front() tanto, push_front() y push_back() invalidarán los iteradores, pero las referencias a los propios elementos seguirán siendo válidas.

Para erase() en cualquier extremo (23.2.1.3/4):

Un borrado en medio del deque invalida todos los iteradores y referencias a los elementos del deque. Un borrado en cualquier extremo del deque invalida solo los iteradores y las referencias a los elementos borrados.

Entonces, pop_front() y pop-back() solo invalidan los iteradores / referencias al elemento al final en cuestión.

Y esto se dice, dice esto acerca de swap() para cualquier contenedor estándar (23.1 / 10 "Requisitos del contenedor"):

ninguna función swap () invalida las referencias, los punteros o los iteradores que se refieren a los elementos de los contenedores que se intercambian.

C ++ 11 agrega las siguientes aclaraciones sobre cómo se comporta el iterador end() en un deque para estas operaciones. Básicamente, un iterador a end() debe tratarse como no válido después de un swap() o después de borrar el último elemento en el deque :

Una operación de borrado que borra el último elemento de un deque invalida solo el iterador pasado-final y todos los iteradores y referencias a los elementos borrados.

Cada iterador que se refiera a un elemento en un contenedor antes del intercambio se referirá al mismo elemento en el otro contenedor después del intercambio. No se especifica si un iterador con valor a.end () antes del swap tendrá valor b.end () después del swap.

Creo que sería una buena idea codificar como si estas reglas se aplicaran incluso si todavía no está utilizando un compilador de C ++ 11.