Maison >développement back-end >C++ >Est-il sûr d'appeler « Erase() » sur un élément de carte C pendant l'itération ?

Est-il sûr d'appeler « Erase() » sur un élément de carte C pendant l'itération ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-11 15:21:14292parcourir

Is it Safe to Call `erase()` on a C   Map Element During Iteration?

Conséquences de l'appel d'effacement() sur un élément de carte pendant l'itération du début à la fin

Lors de l'itération sur une carte en C , il est essentiel de considérer les implications de appeler la méthode Eraser() sur un élément de carte dans la boucle. Plus précisément, la question se pose : est-il sécuritaire d'effacer l'élément et de continuer l'itération, ou est-il nécessaire de collecter les clés dans un autre conteneur et d'effectuer une boucle séparée pour l'effacement ?

En C 03, effacer des éléments d'un map n'invalide aucun itérateur sauf ceux pointant vers l'élément qui a été supprimé. Cependant, il est crucial de noter que votre code modifie l'itérateur après avoir appelé effacer. Ceci est problématique car pm_it devient invalide une fois l'effacement appelé. Pour résoudre ce problème, vous devez incrémenter l'itérateur avant d'appeler effacer.

map<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 iterator and post-increment
    } else {
        ++pm_it;  // Can use pre-increment here for efficiency
    }
}

En C 11, une amélioration significative a été apportée à l'effacement, car il renvoie désormais l'itérateur suivant. Cela élimine le besoin de la technique de post-incrémentation délicate présentée ci-dessus. Au lieu de cela, vous pouvez écrire :

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

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