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

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

DDD
Libérer: 2024-12-18 22:59:12
original
387 Les gens l'ont consulté

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

Supprimer en toute sécurité des éléments d'une std::list pendant l'itération

Problème

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'objectif est de supprimer les éléments inactifs de la liste immédiatement après leur mise à jour, évitant ainsi la nécessité d'un deuxième passage. Cependant, tenter de supprimer des éléments dans la boucle à l'aide des lignes commentées entraîne l'erreur "Itérateur de liste non incrémentable."

Solution

La clé pour supprimer en toute sécurité des éléments pendant l'itération est de suivre les séquence correcte des opérations. Au lieu de l'approche de boucle for présentée ci-dessus, le code doit être modifié en boucle while comme démontré ci-dessous :

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

En incrémentant d'abord l'itérateur (i ), l'itérateur reste valide et peut être utilisé pour supprimer l'élément inactif.

Explication

Dans la boucle for d'origine, tentative de suppression d'un élément en utilisant items.remove(*i) dans la boucle body a invalidé l’itérateur (i), provoquant l’échec de l’itération suivante. La boucle while garantit que l'itérateur est mis à jour avant que l'élément ne soit supprimé, garantissant ainsi sa validité pour l'itération suivante. En utilisant items.erase(i ) ou i = items.erase(i), l'élément approprié est supprimé de la liste et l'itérateur est automatiquement mis à jour pour pointer vers le prochain élément valide.

Cette approche permet pour la suppression efficace des éléments inactifs pendant l'itération sans avoir besoin d'un passage séparé dans 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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal