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!