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
Libérer: 2024-12-11 04:08:09
original
861 Les gens l'ont consulté

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

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

Lors d'une itération dans un ensemble et de la rencontre d'éléments qui doivent être supprimés en fonction de critères spécifiques , il est crucial de considérer l'impact sur l'itérateur. La suppression d'un élément lors d'une itération peut potentiellement invalider l'itérateur, entraînant un comportement indéfini.

Une idée fausse courante est que l'effacement d'un élément d'un ensemble lors d'une itération invaliderait l'itérateur et entraînerait l'incrémentation dans la boucle for. ont un comportement indéfini. Cependant, ce n’est pas nécessairement le cas. Le comportement des itérateurs lors de la suppression d'éléments dépend de l'implémentation et n'est pas défini selon la norme C.

Une approche pour supprimer en toute sécurité des éléments d'un ensemble lors d'une itération consiste à utiliser une structure de boucle alternative :

for (auto it = numbers.begin(); it != numbers.end(); ) {
    if (*it % 2 == 0) {
        it = numbers.erase(it);
    }
    else {
        ++it;
    }
}
Copier après la connexion

Dans ce code, l'itérateur il est passé par valeur à l'opération d'effacement, qui renvoie un itérateur pointant vers l'élément suivant (ou vers la fin de l'ensemble dans le cas où le dernier élément a été supprimé). Cette approche est conforme au standard C et garantit que l'itérateur reste valide.

Une autre option, bien que légèrement plus verbeuse, consiste à créer une copie de l'itérateur actuel avant d'effacer un élément :

for (auto it = numbers.begin(); it != numbers.end(); ) {
    std::set<int>::iterator current = it++;
    if (*current % 2 == 0) {
        numbers.erase(current);
    }
}
Copier après la connexion

Cette solution sépare l'incrément de l'itérateur de l'éventuelle opération d'effacement, garantissant que l'itérateur pointant vers l'élément suivant reste valide.

Il est important de noter que, à moins qu'elle ne soit spécifiquement implémentée pour un conteneur particulier, l'opération d'effacement invalidera généralement tous les itérateurs de l'ensemble, même au-delà de l'élément qui a été supprimé.

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