


La suppression d'éléments d'un « std::set » pendant l'itération est-elle un comportement défini en C ou spécifique à l'implémentation ?
Supprimer des éléments de std::set pendant l'itération : implications de mise en œuvre
Itérer dans un ensemble tout en supprimant des éléments peut présenter des défis, car l'opération pourrait potentiellement invalider l'itérateur. Dans ce contexte, la question se pose : ce comportement est-il défini par le standard C ou est-il spécifique à l'implémentation ?
Dépendance d'implémentation
Selon le standard C (23.1 .2.8), l'insertion d'éléments dans un ensemble ne doit pas affecter les itérateurs ou les références au conteneur, tandis que l'effacement d'éléments ne doit qu'invalider les itérateurs et les références au conteneur. éléments supprimés. Cependant, le comportement des itérateurs lors des opérations d'effacement n'est pas explicitement spécifié, ce qui le laisse ouvert à des décisions spécifiques à l'implémentation.
Implémentation de GCC
Dans l'exemple de code fourni, en utilisant GCC 4.3.3 sur Ubuntu 10.04, l'effacement d'éléments d'un ensemble pendant l'itération n'invalidait pas l'itérateur. Cela suggère que la mise en œuvre de GCC suit une approche plus détendue, permettant l'utilisation continue de l'itérateur après l'effacement.
Solution conforme
Pour garantir la conformité à la norme, une approche différente est requis. Une solution courante consiste à créer une copie de l'itérateur avant d'effacer l'élément :
for (auto it = numbers.begin(); it != numbers.end(); ) { if (*it % 2 == 0) { numbers.erase(it++); } else { ++it; } }
Dans ce cas, l'incrément postfix (it ) transmet l'ancienne position à la fonction delete() tout en sautant simultanément à l'itérateur. élément suivant. L'incrément de suffixe est préféré ici car il évite le problème potentiel de double incrément qui peut survenir avec l'incrément de préfixe (lorsque la condition est fausse).
Mise à jour C 11
Avec Avec l'avènement du C 11, une solution plus élégante est disponible. La fonction effacer() renvoie désormais un itérateur vers l'élément qui suit le dernier élément supprimé (ou set::end si le dernier élément a été supprimé). Cela permet une mise en œuvre plus concise :
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Quels sont les types de valeurs renvoyées par les fonctions du langage C? Qu'est-ce qui détermine la valeur de retour?

Gulc: Cibliothèque C construite à partir de zéro

C Fonction Langue Format de lettre ÉTAPES DE CONVERSION DE CAS

Quelles sont les définitions et les règles d'appel des fonctions du langage C et quelles sont les

Où est la valeur de retour de la fonction de langue C stockée en mémoire?

Utilisation distincte et partage de phrases

Comment utiliser efficacement les algorithmes du STL (trier, trouver, transformer, etc.)?

Comment fonctionne la bibliothèque de modèle standard C (STL)?
