C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Effacer un element d'une liste

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
korchkidu
Guest





PostPosted: Thu Feb 10, 2005 4:48 pm    Post subject: Effacer un element d'une liste Reply with quote



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.
Back to top
xavier
Guest





PostPosted: Thu Feb 10, 2005 5:05 pm    Post subject: Re: Effacer un element d'une liste Reply with quote



korchkidu a dit le 10/02/2005 17:48:
Quote:
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?

j'utilise std::erase_if().

xavier

Back to top
Fabien LE LEZ
Guest





PostPosted: Thu Feb 10, 2005 6:14 pm    Post subject: Re: Effacer un element d'une liste Reply with quote



On Thu, 10 Feb 2005 17:48:25 +0100, korchkidu <korch_ki_du (AT) yahoo (DOT) fr>:

Quote:
je parcours une liste et je veux effacer certains elements suivant les
traitements faits plus tot.

Tu peux utiliser la fonction membre remove_if().

Si tu tiens à parcourir ta liste, tu peux faire un truc du style

for (...::iterator i= ma_liste.begin(); i != ma_liste.end()Wink
{
if (on doit supprimer l'élément)
{
ma_liste.erase (i++);
}
else
{
++i;
}
}


--
;-)

Back to top
Loïc Joly
Guest





PostPosted: Thu Feb 10, 2005 9:07 pm    Post subject: Re: Effacer un element d'une liste Reply with quote

xavier wrote:

Quote:
korchkidu a dit le 10/02/2005 17:48:

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?


j'utilise std::erase_if().

Je serais curieux de savoir comment tu implémenterais un tel algorithme
à base d'itérateurs...

--
Loïc


Back to top
xavier
Guest





PostPosted: Thu Feb 10, 2005 10:08 pm    Post subject: Re: Effacer un element d'une liste Reply with quote

Loïc Joly a dit :
Quote:
xavier wrote:
j'utilise std::erase_if().


Je serais curieux de savoir comment tu implémenterais un tel algorithme
à base d'itérateurs...

Il m'a fallu du temps pour comprendre ce que tu voulais dire...

Puis j'ai compris. J'ai écris std::erase_if(), alors que je pensais à
std:remove_if(). std::remove_if() est la solution fournie par la STL au
problème de l'OT.

la solution complète ayant une forme similaire à :

! template <typename List, typename Predicate>
! void erase_if(List & v, Predicate p) {
! v.erase(std::remove_if(v.begin(), v.end(), p), v.end());
! }

xavier

Back to top
Fabien LE LEZ
Guest





PostPosted: Thu Feb 10, 2005 11:38 pm    Post subject: Re: Effacer un element d'une liste Reply with quote

On Thu, 10 Feb 2005 23:08:13 +0100, xavier <xtrochu (AT) yahoo (DOT) com>:

Quote:
std::remove_if() est la solution fournie par la STL au
problème de l'OT.

A ceci près que std::list<> contient une fonction remove_if()... qui
n'a bien sûr pas le même fonctionnement que std::remove_if(), histoire
de bien compliquer les choses :-/



--
;-)

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Fri Feb 11, 2005 9:48 am    Post subject: Re: Effacer un element d'une liste Reply with quote

xavier wrote:
Quote:
korchkidu a dit le 10/02/2005 17:48:

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?

j'utilise std::erase_if().

Et où est-ce que tu trouves cette fonction ? Je ne la trouve pas
dans ma copie de la norme, et je n'en ai jamais entendu parler
avant.

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 ;
}
}

Mais je ne suis pas sÛr d'après le posting initial si le
problème est l'itérateur dans la boucle, ou d'autres itérateurs
qu'il peut y avoir. Pour les autres itérateurs, s'il n'efface
pas l'élément qu'ils désignent, il n'y a pas de problème avec
std::list.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
korchkidu
Guest





PostPosted: Fri Feb 11, 2005 12:14 pm    Post subject: Re: Effacer un element d'une liste Reply with quote

Fabien LE LEZ wrote:

Quote:
Si tu tiens à parcourir ta liste, tu peux faire un truc du style

for (...::iterator i= ma_liste.begin(); i!=ma_liste.end )
{
if (on doit supprimer l'élément)
{
ma_liste.erase (i++);
}
else
{
++i;
}
}

Ca me parait un peu moins tire par les cheveux que ce que j'ai vu...

Merci,
K.

Back to top
korchkidu
Guest





PostPosted: Fri Feb 11, 2005 12:15 pm    Post subject: Re: Effacer un element d'une liste Reply with quote

[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:


Quote:
std::list<T>::iterator i = l.begin() ;
while ( i != l.end() ) {
if ( condition( *i ) ) {
i = l.erase( i ) ;
} else {
++ i ;
}
}


Ca me parait etre la solution communement utilisee apparemment...

Merci,
K.

Back to top
Fabien LE LEZ
Guest





PostPosted: Fri Feb 11, 2005 2:25 pm    Post subject: Re: Effacer un element d'une liste Reply with quote

On 11 Feb 2005 01:48:07 -0800, [email]kanze (AT) gabi-soft (DOT) fr[/email]:

Quote:
i = l.erase( i ) ;

Tout en faisant attention aux compilos non conformes, pour lesquels
list::erase ne renvoie rien (si, si, ça existe...)


--
;-)

Back to top
Alexandre
Guest





PostPosted: Fri Feb 11, 2005 5:27 pm    Post subject: Re: Effacer un element d'une liste Reply with quote

bonjour,

Quote:
if (on doit supprimer l'élément)
{
ma_liste.erase (i++);

donc incrémentation de i après l'appel de erase()... i qui est devenu non
valide...
Je pense qu'une solution (si erase ne renvoie rien) est :
iterator i_temp = i;
++i_temp;
ma_liste.erase(i);
i=i_temp;




Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Feb 12, 2005 6:48 pm    Post subject: Re: Effacer un element d'une liste Reply with quote

On Fri, 11 Feb 2005 18:27:57 +0100, "Alexandre"
<alex.g (AT) netcourrier (DOT) com>:

Quote:
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.

Quote:
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.




--
;-)

Back to top
James Kanze
Guest





PostPosted: Sun Feb 13, 2005 9:41 pm    Post subject: Re: Effacer un element d'une liste Reply with quote

Fabien LE LEZ wrote:
Quote:
On 11 Feb 2005 01:48:07 -0800, [email]kanze (AT) gabi-soft (DOT) fr[/email]:

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

Back to top
James Kanze
Guest





PostPosted: Sun Feb 13, 2005 9:46 pm    Post subject: Re: Effacer un element d'une liste Reply with quote

[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:

[...]
Quote:
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

Back to top
Fabien LE LEZ
Guest





PostPosted: Sun Feb 13, 2005 10:22 pm    Post subject: Re: Effacer un element d'une liste Reply with quote

On Sun, 13 Feb 2005 22:41:48 +0100, James Kanze <kanze@none>:

Quote:
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à ;-)


--
;-)

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.