OVH Cloud OVH Cloud

Effacer un element d'une liste

14 réponses
Avatar
korchkidu
Bonjour,

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?

K.

4 réponses

1 2
Avatar
Fabien LE LEZ
On Fri, 11 Feb 2005 18:27:57 +0100, "Alexandre"
:

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.




--
;-)


Avatar
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


Avatar
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

Avatar
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à ;-)


--
;-)

1 2