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

Comment supprimer en toute sécurité des éléments d'un std :: list pendant l'itération ?

Barbara Streisand
Libérer: 2024-12-21 04:25:11
original
419 Les gens l'ont consulté

How to Safely Delete Elements from a std::list During Iteration?

Suppression d'éléments pendant une itération dans une std::list

Lors d'une itération dans une std::list, supprimer des éléments tout en conservant un itérateur valide peut être difficile. Considérez le code suivant :

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

L'ajout des lignes commentées pour supprimer immédiatement les éléments inactifs entraînerait une erreur « Itérateur de liste non incrémentable ». En effet, la suppression d'un élément invalide l'itérateur.

Éviter les passes multiples

Pour supprimer des éléments efficacement lors de l'itération, envisagez une approche en boucle while :

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

La clé ici consiste à incrémenter l'itérateur avant de supprimer l'élément. Alternativement, "i = items.erase(i)" peut être utilisé. Cela permet une suppression sûre et efficace des éléments lors de l'itération.

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