Maison >développement back-end >C++ >Comment puis-je supprimer en toute sécurité des éléments d'une carte C pendant l'itération ?

Comment puis-je supprimer en toute sécurité des éléments d'une carte C pendant l'itération ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-09 13:52:14314parcourir

How Can I Safely Remove Elements from a C   Map During Iteration?

Supprimer des éléments d'une carte pendant une itération

En C, parcourir une carte de bibliothèque standard tout en supprimant des éléments peut être difficile, comme l'utilisation de l'effacement () invalide les itérateurs. Cependant, il existe une expression largement acceptée pour résoudre ce problème :

for(auto it = m.begin(); it != m.cend() /* not hoisted */; /* no increment */)
{
  if(must_delete)
  {
    auto next = it;
    it = m.erase(it);      // or "it = m.erase(it)" since C++11
  }
  else
  {
    ++it;
  }
}

Voici comment cette expression fonctionne :

  • Pas de levage : Nous ne hissons pas l'opérateur d'incrémentation en dehors de la condition de boucle. Ceci est critique, car le levage ferait avancer l'itérateur même si l'élément est supprimé, ce qui pourrait conduire à un comportement indéfini.
  • Incrémentation en toute sécurité : Dans la boucle, l'opérateur d'incrémentation est uniquement appliqué après avoir vérifié si l'élément ne doit pas être supprimé.
  • Mise en cache du prochain itérateur (C 11 ou version ultérieure) : Lorsqu'un L'élément est supprimé, nous mettons en cache l'itérateur vers l'élément suivant avant de l'effacer. Cela nous permet de continuer à itérer de manière transparente sans perturber la séquence des itérateurs.

Syntaxe pré-C 11 :

Avant C 11, l'effacement des itérateurs const nécessitait un léger syntaxe différente :

for (std::map<K,V>::iterator it = m.begin(); it != m.end(); ) { /* ... */ }

Constesse et Suppression :

L'effacement d'un élément d'une carte ne viole pas la constance des éléments, comme la suppression d'un pointeur vers une constante. La constance limite principalement la capacité de modifier la valeur, et non sa durée de vie.

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