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
DDDoriginal
2024-12-22 21:22:11958parcourir

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.
    }
}

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!

Déclaration:
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