Maison >développement back-end >C++ >Comment supprimer en toute sécurité des éléments d'un « std :: set » lors d'une 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!