Ha habido algunas preguntas con respecto a este problema antes; Tengo entendido que llamar al std::vector::erase
solo invalidará los iteradores que están en una posición después de el elemento borrado. Sin embargo, después de borrar un elemento, ¿el iterador en esa posición sigue siendo válido (siempre que, por supuesto, no apunte a end()
después del borrado)?std :: invalidación de iterador de vector
Mi comprensión de cómo se implementaría un vector parece sugerir que el iterador es definitivamente útil, pero no estoy del todo seguro de si podría conducir a un comportamiento indefinido.
Como un ejemplo de lo que estoy diciendo, el siguiente código elimina todos los enteros impares de un vector. ¿Este código causa un comportamiento indefinido?
typedef std::vector<int> vectype;
vectype vec;
for (int i = 0; i < 100; ++i) vec.push_back(i);
vectype::iterator it = vec.begin();
while (it != vec.end()) {
if (*it % 2 == 1) vec.erase(it);
else ++it;
}
El código funciona bien en mi máquina, pero eso no me convence de que sea válido.
¿Por qué se pasa por referencia x' 'const en lugar de por ¿valor? – fredoverflow
@Fred: ninguna razón en particular; gracias por señalar eso. –
@James Pero, ¿cómo funciona el código anterior en cuestión, ya que borrar invalidará los iteradores? – Kapil