Cuando el contenedor al que apunta un iterador cambia de forma internamente, es decir, cuando los elementos se mueven de una posición a otra, y el iterador inicial sigue apuntando a la antigua ubicación no válida, se denomina invalidación del iterador. Se debe tener cuidado al usar iteradores en C++. Cuando iteramos sobre nuestro contenedor usando iteradores, puede suceder que el iterador se invalide. Esto puede deberse al cambio en la forma y el tamaño del contenedor durante la iteración.
Por ejemplo, la invalidación del iterador en un vector siempre que, en cualquier punto del vector, se inserte un elemento o se elimine un elemento del vector. Tomemos un ejemplo para entender esto,
CPP
// CPP program to demonstrate iterator // invalidations #include <bits/stdc++.h> using namespace std; // Driver Code int main() { // Creating a sample vector vector<int> v = { 1, 5, 10, 15, 20 }; // Changing vector while iterating over it // (This causes iterator invalidation) for (auto it = v.begin(); it != v.end(); it++) if ((*it) == 5) v.push_back(-1); for (auto it = v.begin(); it != v.end(); it++) cout << (*it) << " "; return 0; }
1 5 10 15 20 -1 -1
En el código de ejemplo anterior, puede suceder que cuando agregamos un elemento -1 mientras iteramos el vector, el tamaño del vector puede superar el tamaño máximo, por lo que se asigna una nueva memoria al vector y se copian todos los elementos. allá. Pero, nuestro iterador aún apunta a la dirección de memoria anterior anterior. Entonces, ahora podemos decir que el iterador se invalida. Este es un ejemplo de invalidación. A continuación se presentan algunas reglas para la invalidación del iterador.
Reglas de invalidación del iterador:
1. Inserción
Vector | Todos los iteradores que apuntan a un elemento antes del punto de inserción no se ven afectados, pero todos los demás se invalidan. Pero, en caso de que, debido a la inserción, el tamaño del vector supere la capacidad anterior, todos los iteradores se invalidarán como se explica en el ejemplo anterior. |
---|---|
Deque | Todos los iteradores y referencias se invalidan a menos que el miembro insertado esté al final (anverso o reverso) de la deque (en cuyo caso se invalidan todos los iteradores, pero las referencias a los elementos no se ven afectadas). |
Lista | Todos los iteradores y referencias no se ven afectados. |
conjunto, mapa, multiconjunto, multimapa | Todos los iteradores y referencias no se ven afectados. |
2. Borrado
Vector | Cada iterador y referencia después del punto de borrado se invalida. |
---|---|
Deque | Todos los iteradores y referencias se invalidan a menos que los miembros borrados estén al final (anverso o reverso) de la deque (en cuyo caso solo se invalidan los iteradores y las referencias a los miembros borrados) |
Lista | Solo se invalidan los iteradores y las referencias al elemento borrado. |
Conjunto, mapa, multiconjunto, multimapa | Solo se invalidan los iteradores y las referencias a los elementos borrados. |
3. Cambiar el tamaño
Vector , Deque y Lista | Según insertar/borrar. |
---|
Nota: La invalidación de un iterador no siempre significa que la desreferenciación de dicho iterador haga que un programa se bloquee. También incluye la posibilidad de que el iterador no apunte a un elemento al que se supone que apunta.
Este artículo es una contribución de Ashish Sharma . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA