Invalidación de iterador en C++

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;
}
Producción

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *