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++; // ?????
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
On Fri, 22 Jan 2010 05:54:46 -0800 (PST), Guillaume
<g.gourdin@gmail.com>:
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.
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.