"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ## **¿Los iteradores devueltos por `std::vector::erase` apuntan a elementos válidos después de la eliminación?**

## **¿Los iteradores devueltos por `std::vector::erase` apuntan a elementos válidos después de la eliminación?**

Publicado el 2024-11-09
Navegar:542

## **Do `std::vector::erase`-returned iterators Point to Valid Elements After Removal?**

Invalidación de iteradores std::vector: una explicación detallada

El concepto de invalidación de iteradores en std::vector se ha discutido con frecuencia. Para aclarar, el borrado de elementos vectoriales mediante std::vector::erase invalida los iteradores colocados estrictamente después del elemento borrado.

Sin embargo, la validez del iterador en la posición exacta del elemento borrado sigue siendo incierta. Lógicamente, se podría suponer que este iterador sigue siendo válido ya que la implementación subyacente del vector generalmente desplaza los elementos restantes para llenar el espacio vacío. Sin embargo, el comportamiento preciso y la posibilidad de resultados indefinidos son menos seguros.

Considere el siguiente ejemplo, que ilustra la eliminación de números enteros impares de un vector:

typedef std::vector vectype;
vectype vec;

for (int i = 0; i 

Si bien este código parece ejecutarse sin errores en la práctica, su validez sigue siendo discutible.

La respuesta está en el comportamiento de borrado: de hecho, invalida todos los iteradores en o después del iterador( s) pasó a borrar. Sin embargo, también devuelve un nuevo iterador inmediatamente después de los elementos borrados o hasta el final si dicho elemento no existe. Este iterador se puede utilizar para reanudar la iteración.

Es importante tener en cuenta que el método anterior de eliminación de enteros impares es ineficiente (O(n2)) porque cada borrado requiere un cambio de todos elementos posteriores. El modismo borrar-eliminar ofrece una solución mucho más eficiente (O(n)):

bool is_odd(int x) { return (x % 2) == 1; }
vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3