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-11 04:08:09793parcourir

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

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

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!

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