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 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-28 13:21:10936parcourir

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

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

Lors de l'itération dans un ensemble, il est nécessaire de supprimer certains éléments en fonction de critères précis. Bien qu'il puisse sembler logique de supposer que l'effacement d'un élément invaliderait l'itérateur, ce comportement dépend de l'implémentation.

La norme 23.1.2.8 stipule que « Les membres d'insertion ne doivent pas affecter la validité des itérateurs et des références à l'itérateur. conteneur, et les membres d'effacement doivent invalider uniquement les itérateurs et les références aux éléments effacés. Sur cette base, on ne peut pas supposer que la suppression d'un élément lors d'une itération invaliderait toujours l'itérateur.

Une approche consiste à utiliser un opérateur d'incrémentation postfix après la suppression d'un élément. Cela transmet l'ancienne position à la fonction d'effacement tout en pointant simultanément l'itérateur vers une position plus récente :

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

Une autre méthode consiste à copier l'itérateur actuel et à l'incrémenter plus tard :

while (it != numbers.end()) {
    // Copy the current iterator and increment it
    std::set<int>::iterator current = it++;
    int n = *current;
    if (n % 2 == 0) {
        // Don't invalidate iterator it, as it points to the next element
        numbers.erase(current);
    }
}

C 11 simplifie ce processus avec la fonction d'effacement renvoyant un itérateur à l'élément suivant le dernier élément supprimé :

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

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