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 ?

Patricia Arquette
Libérer: 2024-12-12 15:20:11
original
641 Les gens l'ont consulté

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

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;
  }
}
Copier après la connexion

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(); ) { /* ... */ }
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal