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

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-11 00:38:09474parcourir

How to Safely Remove Items from a C   Map During Iteration?

Supprimer des éléments d'une carte lors d'une itération en C

Lorsque vous parcourez une carte et tentez de supprimer des éléments en fonction de conditions spécifiques, il est Il est important de considérer l’impact de l’effacement d’éléments sur l’itérateur. Effacer un élément lors d'une itération sur la carte invalidera l'itérateur, ce qui rendra difficile la poursuite du processus d'itération.

Idiome d'effacement standard pour les conteneurs associatifs

L'idiome standard pour effacer d'un conteneur associatif (comme une carte) pendant l'itération est comme suit :

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

Explication

  • Démontage de la condition de boucle : Cela garantit que la boucle vérifie la fin de la carte à chaque fois.
  • Ne pas incrémenter l'itérateur dans le cas de suppression :Quand un élément est supprimé, l'itérateur pointe vers l'élément suivant de la carte. Cela signifie que la boucle ne doit pas incrémenter l'itérateur après l'effacement.
  • Itérateurs const : Dans la version antérieure à C 11, les itérateurs const ne pouvaient pas être effacés. Dans ce cas, un itérateur traditionnel (par exemple, std::map::iterator) doit être utilisé.

En suivant cet idiome, vous pouvez supprimer en toute sécurité des éléments de la carte tout en itérer sans invalider les itérateurs.

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