En el siguiente código recorro un mapa y pruebo si un elemento necesita ser borrado. ¿Es seguro borrar el elemento y seguir iterando o necesito recolectar las claves en otro contenedor y hacer un segundo ciclo para llamar a erase ()?
map<string, SerialdMsg::SerialFunction_t>::iterator pm_it;
for (pm_it = port_map.begin(); pm_it != port_map.end(); pm_it++)
{
if (pm_it->second == delete_this_id) {
port_map.erase(pm_it->first);
}
}
ACTUALIZACIÓN: Por supuesto, luego leí esta pregunta que no pensé que estaría relacionada, pero responde a mi pregunta.
std::remove_if
no funciona constd:map
Respuestas:
C ++ 11
Esto se ha solucionado en C ++ 11 (o borrar se ha mejorado / hecho coherente en todos los tipos de contenedores).
El método de borrado ahora devuelve el siguiente iterador.
C ++ 03
Borrar elementos en un mapa no invalida ningún iterador.
(aparte de los iteradores en el elemento que se eliminó)
En realidad, insertar o eliminar no invalida ninguno de los iteradores:
También vea esta respuesta:
Mark Ransom Technique
Pero debe actualizar su código:
en su código, incrementa pm_it después de llamar a borrar. En este punto es demasiado tarde y ya está invalidado.
fuente
pm_it++
garantiza que el orden de evaluación del incremento en la expresión postfix se ejecutará antes de ingresar la función?Sequence
contenedores. La propiedad especial de losAssociative
contenedores es que los iteradores no se invalidan al borrar o insertar (a menos que apunten al elemento que se borró). Vector y borrar iteradores de usign se cubre en detalle en la pregunta apropiada stackoverflow.com/a/3938847/14065Así es como hago eso ...
fuente
Así es como lo haría, aproximadamente:
Hay algo extraño
pero acabo de copiarlo de tu código de ejemplo.
fuente