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
Linda Hamiltonoriginal
2024-12-20 13:01:21486parcourir

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

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!

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