Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Effacer un élément dans un map

1 réponse
Avatar
Guillaume
Bonjour =E0 tous,

je lis que le canon pour enlever des =E9l=E9ments d'une map v=E9rifiant un
pr=E9dicat est:


for( iter =3D Structmap.begin(); iter !=3D 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=E9compose:
Structmap.erase( iter ); // Invalide l'iterator
iter++; // ?????

Quid donc? Merci pour votre aide!

1 réponse

Avatar
Fabien LE LEZ
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.