Maison > développement back-end > C++ > Comment supprimer en toute sécurité des éléments d'une « std :: list » lors d'une itération ?

Comment supprimer en toute sécurité des éléments d'une « std :: list » lors d'une itération ?

Linda Hamilton
Libérer: 2024-12-20 13:01:21
original
489 Les gens l'ont consulté

How to Safely Remove Elements from an `std::list` While Iterating?

Pouvez-vous supprimer des éléments d'une std::list tout en la parcourant tout en la parcourant ?

En C , la classe std::list intégrée est une liste à double lien, permettant une insertion et une suppression efficaces d'éléments. Cependant, lorsque vous tentez de modifier une liste pendant une itération, il est crucial d'aborder l'opération avec prudence.

Problème : Une erreur s'est produite lors de la vérification itérative de l'état d'activité des éléments dans std : liste et essayer de supprimer immédiatement les éléments inactifs. L'erreur « Itérateur de liste non incrémentable » a été rencontrée lors de la tentative de déplacement de l'itérateur après la suppression d'un élément.

Solution : La clé pour réussir à supprimer des éléments pendant l'itération consiste à appliquer les modifications à l'itérateur. d'abord, avant d'effectuer la suppression. Au lieu d'essayer d'incrémenter l'itérateur puis de supprimer l'élément, il est plus approprié de restructurer la boucle en tant que boucle while, permettant à l'itérateur d'être incrémenté dans la boucle elle-même. Ainsi, le code mis à jour ci-dessous démontre l'approche correcte :

std::list<item*>::iterator i = items.begin();
while (i != items.end()) {
    bool isActive = (*i)->update();
    if (!isActive) {
        i = items.erase(i);  // alternatively, i = items.erase(i++);
    } else {
        other_code_involving(*i);
        ++i;
    }
}
Copier après la connexion

Ce code révisé garantit que l'itérateur est correctement incrémenté avant d'exécuter la suppression de l'élément, évitant ainsi l'erreur et permettant une suppression efficace des éléments inactifs lors de l'itération. la liste.

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