Pièges potentiels lors de l'effacement d'éléments de carte pendant une itération
Lors de la manipulation de cartes en C, il est crucial de considérer les conséquences de l'effacement d'éléments lors d'une itération eux. Cette question explore les problèmes potentiels et propose des solutions pour C 03 et C 11.
Considérations C 03
En C 03, l'effacement d'un élément d'une carte n'a pas d'effet invalide automatiquement tous les itérateurs de la carte. Cependant, cela invalide l'itérateur pointant vers l'élément supprimé. Pour parcourir une carte en toute sécurité et effacer des éléments pendant l'itération, vous devez incrémenter l'itérateur avant d'appeler l'effacement. Voici une version mise à jour du code fourni dans la question :
map<string, SerialdMsg::SerialFunction_t><string, SerialdMsg::SerialFunction_t>::iterator pm_it = port_map.begin(); while (pm_it != port_map.end()) { if (pm_it->second == delete_this_id) { port_map.erase(pm_it++); // Use post-increment to get the updated iterator. } else { ++pm_it; // Can use pre-increment for efficiency. } }
Améliorations de C 11
En C 11, la méthode delete() a été considérablement améliorée. Il renvoie désormais un itérateur pointant vers l'élément suivant de la carte, ce qui permet d'effacer en toute sécurité des éléments pendant l'itération sans invalider les autres itérateurs. Le code mis à jour à l'aide de C 11 serait :
auto pm_it = port_map.begin(); while (pm_it != port_map.end()) { if (pm_it->second == delete_this_id) { pm_it = port_map.erase(pm_it); } else { ++pm_it; } }
Technique Mark Ransom
La technique Mark Ransom est une autre option dans C 03 pour effacer en toute sécurité des éléments de carte pendant l'itération. . Il s'agit de créer un vecteur temporaire pour stocker les clés des éléments à effacer puis de les effacer dans une seconde boucle.
En conclusion, lors de l'effacement d'éléments d'une carte lors d'une itération en C , prendre en compte le potentiel invalidation des itérateurs et utilisez l’approche appropriée en fonction de la version C que vous utilisez. N'oubliez pas de toujours incrémenter l'itérateur avant d'effacer un élément pour maintenir la cohérence et éviter un comportement inattendu.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!