Maison > développement back-end > C++ > Que se passe-t-il lorsque vous effacez un élément de carte lors d'une itération en C ?

Que se passe-t-il lorsque vous effacez un élément de carte lors d'une itération en C ?

Linda Hamilton
Libérer: 2024-12-15 16:02:11
original
994 Les gens l'ont consulté

What Happens When You Erase a Map Element During Iteration in C  ?

Que se passe-t-il si vous appelez Eraser() sur un élément de carte lors d'une itération du début à la fin ?

Lors d'une itération sur un map en C , il est important de considérer le comportement de l'effacement des éléments lors de l'itération. Cette opération peut conduire à des résultats inattendus si elle n'est pas gérée correctement.

C 11

En C 11, la méthode delete() a été améliorée et est désormais cohérente sur tous les types de conteneurs. Lorsqu'un élément est effacé, la méthode Eraser() renvoie l'itérateur suivant. Cela vous permet de continuer à itérer la carte sans rencontrer de problèmes.

Le code suivant montre la bonne façon d'effacer des éléments d'une carte lors d'une itération en C 11 :

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

En C 03, effacer des éléments d'une carte tout en l'itération peut conduire à des itérateurs invalidés. Pour éviter ce problème, vous devez parcourir la carte à l'aide d'une variable de boucle qui est incrémentée en dehors de l'opération Eraser().

Le code suivant montre la manière correcte d'effacer des éléments d'une carte lors d'une itération en C 03. :

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.
        // Note the post increment.
        // Increments the iterator but returns the
        // original value for use by erase
    } else {
        ++pm_it; // Can use pre-increment in this case
        // To make sure you have the efficient version
    }
}
Copier après la connexion

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal