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
1087 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!

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