Maison > développement back-end > C++ > Que se passe-t-il lors de l'effacement d'un élément de carte lors d'une itération en C ?

Que se passe-t-il lors de l'effacement d'un élément de carte lors d'une itération en C ?

Patricia Arquette
Libérer: 2024-12-16 15:24:11
original
293 Les gens l'ont consulté

What Happens When Erasing a Map Element During Iteration in C  ?

Que se passe-t-il lorsque vous appelez Eraser() sur un élément de carte lors d'une itération du début à la fin ?

En C 03, l'effacement d'un élément dans une carte invalide l'itérateur pointant vers cet élément. Cependant, en C 11 et versions ultérieures, la méthode d'effacement renvoie l'itérateur suivant, permettant une itération sûre après la suppression de l'élément.

Solution pour C 03

En C 03, pour garantir une itération sûre après la suppression d'éléments d'une carte, mettez à jour votre code pour utiliser l'itérateur renvoyé par map::erase() et effectuez post-incrémentation sur l'itérateur après avoir appelé effacer().

map<string, SerialdMsg::SerialFunction_t>::iterator pm_it = port_map.begin();<br>while(pm_it != port_map.end())<br>{</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">if (pm_it->second == delete_this_id)
{
    port_map.erase(pm_it++);  // Use iterator.
                              // Note the post increment.
                              // Increments the iterator but returns the
                              // original value for use by erase 
}
else
{
    ++pm_it;           // Can use pre-increment in this case
                       // To make sure you have the efficient version
}
Copier après la connexion

}

Solution pour C 11 et versions ultérieures

En C 11 et versions ultérieures, Eraser() renvoie l'itérateur suivant, ce qui permet de itérer et supprimer des éléments simultanément en utilisant la syntaxe suivante :

<br>auto pm_it = port_map.begin();<br>while(pm_it != port_map.end())<br>{ </p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">if (pm_it->second == delete_this_id)
{
    pm_it = port_map.erase(pm_it);
}
else
{
    ++pm_it;
}
Copier après la connexion

}

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
Article précédent:Comment pouvons-nous implémenter un compteur ABA en C 11 en utilisant uniquement CAS ? Article suivant:Quand devriez-vous utiliser le mot-clé « friend » en C pour l'encapsulation ?
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
Derniers numéros
Rubriques connexes
Plus>
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal