OVH Cloud OVH Cloud

Comment utiliser erase avec les list dans une boucle

2 réponses
Avatar
Eric Bart
Bonjour,

J'ai essayé :

list<int>::iterator itLi;
for(itLi = li.begin(); itLi !=li.end(); itLi++)
li.erase(itLi);

Mais le compilateur est paumé après le premier passage.
Le code ci-dessous fonctionne :

itLi = li.begin();
while(itLi != li.end())
itLi = li.erase(itLi);

Je me demande comment utiliser cette technique quand on
efface partiellement. Comme ça ? :

itLi = li.begin();
while(itLi != li.end())
if((*itLi) == xxx)
itLi = li.erase(itLi);
else
itLi++;

J'ai aussi essayé d'effacer en commençant par la fin avec un
reverse_iterator mais erase ne veut d'un reverse_iterator.

2 réponses

Avatar
drkm
"Eric Bart" writes:

list<int>::iterator itLi;
for(itLi = li.begin(); itLi !=li.end(); itLi++)
li.erase(itLi);


Après `erase()', l'itérateur est invalide (en fait, tous les
itérateurs désignant le même élément, mais pas les autres, je pense).
Donc incrémenter `itLi' est incorrect.

Mais le compilateur est paumé après le premier passage.
Le code ci-dessous fonctionne :

itLi = li.begin();
while(itLi != li.end())
itLi = li.erase(itLi);


Le point intéressant est que le retour d'`erase()' fournit un
itérateur sur l'élément suivant celui qui a été détruit (ou end() en
cas de fin de liste).

Mais le mieux dans ce cas est :

li.erase( li.begin() , li.end() ) ;

qui est équivalent à :

li.clear() ;

Je me demande comment utiliser cette technique quand on
efface partiellement. Comme ça ? :

itLi = li.begin();
while(itLi != li.end())
if((*itLi) == xxx)
itLi = li.erase(itLi);
else
itLi++;


Yep. Regarde aussi `remove_if<>()'.

--drkm

Avatar
Eric Bart