invalidação do iterador std :: vector
Houve algumas perguntas sobre esse problema antes; meu entendimento é esse chamadostd::vector::erase
invalidará apenas iteradores que estão em uma posiçãodepois de o elemento apagado. No entanto, após apagar um elemento, o iterador nessa posição ainda é válido (desde que, é claro, que ele não aponte paraend()
após a exclusão)?
Meu entendimento de como um vetor seria implementado parece sugerir que o iterador é definitivamente utilizável, mas não tenho muita certeza se isso pode levar a um comportamento indefinido.
Como um exemplo do que estou falando, o código a seguir remove todos os números inteiros ímpares de um vetor. Esse código causa comportamento 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;
}
O código funciona bem na minha máquina, mas isso não me convence de que é válido.