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

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

Patricia Arquette
Patricia Arquetteoriginal
2024-12-13 06:38:14761parcourir

How to Safely Delete Elements from a std::set While Iterating?

Suppression d'éléments de std::set lors d'une itération : une analyse

En C, le conteneur std::set permet un stockage et une récupération efficaces d'éléments uniques. Lors de la modification d'ensembles, des scénarios peuvent survenir dans lesquels vous devez parcourir ses éléments et supprimer ceux qui répondent à des critères spécifiques. Comprendre les nuances de la suppression d'éléments au cours de l'itération est crucial pour éviter les pièges potentiels.

L'exemple de code que vous avez fourni montre une tentative de suppression de nombres pairs d'un ensemble en itérant avec un std::set::iterator. Cependant, l'approche d'effacement au sein de la boucle soulève des questions sur la validité des itérateurs.

Le standard C (section 23.1.2.8) précise que toute opération de modification, y compris l'effacement, invalide uniquement les itérateurs et les références à l'élément effacé. Cependant, il n'offre aucune garantie pour les itérateurs pointant vers d'autres éléments du conteneur.

Dans le contexte du code donné, l'implémentation suivante adhère à la norme et garantit la validité de l'itérateur :

for (auto it = numbers.begin(); it != numbers.end(); ) {
    if (*it % 2 == 0) {
        numbers.erase(it++);
    }
    else {
        ++it;
    }
}

Cette boucle révisée utilise un "incrément postfix" (it ), qui renvoie un itérateur à l'ancienne position avant de passer à la suivante. Ainsi, l'élément qui vient d'être visité peut être effacé en toute sécurité tout en conservant l'itérateur pour les itérations suivantes.

Avec l'avènement de C 11, la fonction membre d'effacement renvoie un itérateur à l'élément suivant (ou std::set:: fin si le dernier élément a été supprimé). Cette mise à jour offre une solution plus concise et élégante :

for (auto it = numbers.begin(); it != numbers.end(); ) {
    if (*it % 2 == 0) {
        it = numbers.erase(it);
    }
    else {
        ++it;
    }
}

En résumé, même si la suppression d'éléments d'un ensemble au cours d'une itération peut sembler intuitive, elle nécessite une compréhension claire du comportement de l'itérateur et des spécifications standard pour éviter les pièges potentiels. Les implémentations discutées ici sont conformes à la norme C et garantissent une suppression prévisible et efficace des éléments d'un ensemble.

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