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

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-24 17:00:12634parcourir

How Can I Safely Remove Elements from a Map While Iterating in C  ?

Itération de carte sécurisée avec suppression d'éléments

Lorsque vous travaillez avec des cartes, vous pouvez rencontrer le besoin de supprimer des éléments lors d'une itération sur elles. Cependant, l'utilisation de la méthode Eraser() de la carte directement dans une boucle peut invalider les itérateurs. Pour éviter ce problème, utilisez l'idiome suivant :

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;
  }
}

Cet idiome utilise une boucle for non basée sur une plage pour modifier directement le conteneur. En incrémentant l'itérateur à l'intérieur de la boucle uniquement lorsque l'élément ne doit pas être supprimé, nous maintenons l'intégrité de l'itération.

Notez qu'avant C 11, l'effacement des itérateurs const nécessitait une syntaxe légèrement différente :

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

N'oubliez pas que la suppression d'éléments ne viole pas la constance, car les éléments const peuvent toujours cesser d'exister.

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