Effacer un élément dans un map

Le
Guillaume
Bonjour à tous,

je lis que le canon pour enlever des éléments d'une map vérifiant un
prédicat est:


for( iter = Structmap.begin(); iter != Structmap.end(); ){
if ( iter->second.Membertestvalue or iter-
>second.AnotherMembertestvalue ) {
Structmap.erase( iter++ );
}
else
++iter;
//and so on
}

Mais je me pose la question: comment "Structmap.erase( iter++ );" est
valide? Si je décompose:
Structmap.erase( iter ); // Invalide l'iterator
iter++; // ?????

Quid donc? Merci pour votre aide!
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fabien LE LEZ
Le #21028491
On Fri, 22 Jan 2010 05:54:46 -0800 (PST), Guillaume

Mais je me pose la question: comment "Structmap.erase( iter++ );" est
valide? Si je décompose:
Structmap.erase( iter ); // Invalide l'iterator
iter++; // ?????



En C++, tous les arguments à une fonction sont évalués avant l'appel à
cette fonction.

Ainsi, si tu écris "f(n++)", ce qui se passe est :
operator++ effectue une copie de n, incrémente n, puis renvoie
la copie (qui a donc la valeur avant incrémentation)
f est appelée avec cette copie

Donc, ici, c'est la copie de iter qui est passée à erase (et perd sa
validité, mais c'est pas grave, puisqu'on ne l'utilise pas après).
En revanche, le "vrai" iter pointe sur l'élément suivant, qui existe
toujours.
Publicité
Poster une réponse
Anonyme