Estoy tratando de averiguar cómo funcionan los iteradores std::multimap
, por lo tanto, he creado un ejemplo simple que muestra la esencia de mi problema. Si no comentario el caso 1, espero que el iterador apunte al primer elemento con la clave 1, pero en realidad imprime todos los valores asociados con la clave 0 (como que nada se borró) y a veces falla, probablemente porque el iterador no es válido. Sin embargo, si se elimina el caso 2, todos los valores con la clave 1 se borran correctamente.C++ invalidación de iterador multimap
¿Hay alguna manera de saber cuál es el siguiente iterador válido para el multimap
después del borrado? (por ejemplo std::vector.erase(...)
devuelve uno)
std::multimap<int, int> m;
for(int j=0; j<3; ++j) {
for(int i=0; i<5; ++i) {
m.insert(std::make_pair(j, i));
}
}
for(std::multimap<int, int>::iterator it=m.begin(); it!=m.end();) {
printf("%d %d\n", (*it).first, (*it).second);
++it;
if((*it).second == 3) {
//m.erase(0); //case 1
m.erase(1); //case 2
}
}
"' (* it) .first' "¿por qué no' it-> first'? – curiousguy
¿Realmente importa? logra lo mismo y estoy 95% seguro de que se compilará con el mismo código. –
@curiousguy porque me gusta escribir (* it) .first. – givi