Dans le code suivant, je parcourt une carte et teste si un élément doit être effacé. Est-il sûr d'effacer l'élément et de continuer à itérer ou dois-je collecter les clés dans un autre conteneur et faire une deuxième boucle pour appeler effacer ()?
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);
}
}
MISE À JOUR: Bien sûr, j'ai ensuite lu cette question que je ne pensais pas être liée mais répond à ma question.
std::remove_if
ne fonctionne pas avecstd:map
Réponses:
C ++ 11
Ce problème a été corrigé dans C ++ 11 (ou l'effacement a été amélioré / rendu cohérent dans tous les types de conteneurs).
La méthode erase renvoie maintenant l'itérateur suivant.
C ++ 03
La suppression d'éléments dans une carte n'invalide aucun itérateur.
(à l'exception des itérateurs sur l'élément qui a été supprimé)
En fait, l'insertion ou la suppression n'invalide aucun des itérateurs:
Voir aussi cette réponse:
Mark Ransom Technique
Mais vous devez mettre à jour votre code:
dans votre code, vous incrémentez pm_it après avoir appelé erase. À ce stade, il est trop tard et est déjà invalidé.
la source
pm_it++
garanti pour être exécuté avant l'entrée de la fonction?Sequence
conteneurs. La propriété spéciale desAssociative
conteneurs est que les itérateurs ne sont pas invalidés par effacement ou insertion (à moins qu'ils ne pointent sur l'élément qui a été effacé). Le vecteur et l'effacement des itérateurs sont traités en détail dans la question appropriée stackoverflow.com/a/3938847/14065Voici comment je fais ça ...
la source
Voici comment je le ferais, approximativement:
Il y a quelque chose d'étrange dans
mais je viens de le copier à partir de votre exemple de code.
la source