je parcours une liste et je veux effacer certains elements suivant les
traitements faits plus tot. Comme le fait de faire erase invalide
l'iterateur ca me pose forcement un probleme.
J'ai regarde sur le web mais franchement les solutions proposees sont
pas tres "jolies" je trouve. Vous faites comment vous?
if (on doit supprimer l'élément) { ma_liste.erase (i++);
donc incrémentation de i après l'appel de erase()...
Uh ? Où as-tu vu ça ? L'argument d'une fonction (ici, list::erase) est complètement évalué avant que la fonction soit appelée.
operator++(int) effectue une copie de l'ancienne valeur, incrémente, puis renvoie la copie de l'ancienne valeur, qui est passée à erase.
Je pense qu'une solution (si erase ne renvoie rien) est : iterator i_temp = i; ++i_temp; ma_liste.erase(i); i=i_temp;
Ce qui fait rigoureusement la même chose que mon code.
-- ;-)
James Kanze
Fabien LE LEZ wrote:
On 11 Feb 2005 01:48:07 -0800, :
i = l.erase( i ) ;
Tout en faisant attention aux compilos non conformes, pour lesquels list::erase ne renvoie rien (si, si, ça existe...)
Ah bon. Je ne savais pas. (J'ai bien entendu parler d'un compilateur où insert renvoyait un itérateur, même quand la norme disait qu'il devait renvoyer void. Mais à mon avis, c'est plutôt un boggue dans la norme là.)
-- James Kanze home: www.gabi-soft.fr Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Fabien LE LEZ wrote:
On 11 Feb 2005 01:48:07 -0800, kanze@gabi-soft.fr:
i = l.erase( i ) ;
Tout en faisant attention aux compilos non conformes, pour
lesquels list::erase ne renvoie rien (si, si, ça existe...)
Ah bon. Je ne savais pas. (J'ai bien entendu parler d'un
compilateur où insert renvoyait un itérateur, même quand la
norme disait qu'il devait renvoyer void. Mais à mon avis, c'est
plutôt un boggue dans la norme là.)
--
James Kanze home: www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Tout en faisant attention aux compilos non conformes, pour lesquels list::erase ne renvoie rien (si, si, ça existe...)
Ah bon. Je ne savais pas. (J'ai bien entendu parler d'un compilateur où insert renvoyait un itérateur, même quand la norme disait qu'il devait renvoyer void. Mais à mon avis, c'est plutôt un boggue dans la norme là.)
-- James Kanze home: www.gabi-soft.fr Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
James Kanze
wrote:
[...]
En passant, la solution classique resemble un peu à :
std::list<T>::iterator i = l.begin() ; while ( i != l.end() ) { if ( condition( *i ) ) { i = l.erase( i ) ; } else { ++ i ; } }
Un alternatif, qui marche même si erase ne renvoie pas de valeur, serait :
std::list<T>::iterator i = l.begin() ; while ( i != l.end() ) { std::list<T>::iterator tmp = i ++ ; if ( condition( *tmp ) ) { l.erase( tmp ) ; } }
On peut préférer l'un ou l'autre, selon les goûts.
-- James Kanze home: www.gabi-soft.fr Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
kanze@gabi-soft.fr wrote:
[...]
En passant, la solution classique resemble un peu à :
std::list<T>::iterator i = l.begin() ;
while ( i != l.end() ) {
if ( condition( *i ) ) {
i = l.erase( i ) ;
} else {
++ i ;
}
}
Un alternatif, qui marche même si erase ne renvoie pas de
valeur, serait :
std::list<T>::iterator i = l.begin() ;
while ( i != l.end() ) {
std::list<T>::iterator tmp = i ++ ;
if ( condition( *tmp ) ) {
l.erase( tmp ) ;
}
}
On peut préférer l'un ou l'autre, selon les goûts.
--
James Kanze home: www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
En passant, la solution classique resemble un peu à :
std::list<T>::iterator i = l.begin() ; while ( i != l.end() ) { if ( condition( *i ) ) { i = l.erase( i ) ; } else { ++ i ; } }
Un alternatif, qui marche même si erase ne renvoie pas de valeur, serait :
std::list<T>::iterator i = l.begin() ; while ( i != l.end() ) { std::list<T>::iterator tmp = i ++ ; if ( condition( *tmp ) ) { l.erase( tmp ) ; } }
On peut préférer l'un ou l'autre, selon les goûts.
-- James Kanze home: www.gabi-soft.fr Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Fabien LE LEZ
On Sun, 13 Feb 2005 22:41:48 +0100, James Kanze :
Ah bon. Je ne savais pas.
C'est normal, j'utilise un vieux compilateur -- t'étais même pas né que je l'utilisais déjà ;-)
-- ;-)
On Sun, 13 Feb 2005 22:41:48 +0100, James Kanze <kanze@none>:
Ah bon. Je ne savais pas.
C'est normal, j'utilise un vieux compilateur -- t'étais même pas né
que je l'utilisais déjà ;-)