Maison >développement back-end >C++ >Comment supprimer en toute sécurité des éléments d'une carte C pendant l'itération ?
Suppression d'éléments d'une carte pendant une itération
Lors de l'itération sur une carte, l'approche courante consiste à utiliser une boucle for basée sur une plage. Cependant, modifier la carte pendant l'itération peut entraîner un comportement inattendu, car les itérateurs deviendront invalides.
La technique recommandée pour supprimer des éléments d'une carte pendant l'itération est connue sous le nom d'« idiome d'effacement de conteneur associatif » :
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 garantit que l'itérateur reste valide après la suppression de l'élément en utilisant l'incrément de préfixe opérateur.
Notez qu'il est important d'utiliser une boucle for traditionnelle au lieu d'une boucle for basée sur une plage dans ce cas, car la modification du conteneur invalidera les itérateurs de la boucle basée sur une plage.
Avant C 11, il était nécessaire d'utiliser un type d'itérateur distinct lors de l'itération sur une carte pour supprimer des éléments :
for (std::map<K, V>::iterator it = m.begin(); it != m.end(); ) { /* ... */ }
Dans les deux cas, effacer un élément ne viole pas la constance de l'élément, car la constance en C n'affecte pas la durée de vie d'un objet.
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!