Maison > développement back-end > C++ > Comment effacer en toute sécurité des éléments de carte lors d'une itération en C ?

Comment effacer en toute sécurité des éléments de carte lors d'une itération en C ?

DDD
Libérer: 2024-12-22 21:22:11
original
905 Les gens l'ont consulté

How to Safely Erase Map Elements While Iterating in C  ?

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.
    }
}
Copier après la connexion

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;
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal