| View previous topic :: View next topic |
| Author |
Message |
korchkidu Guest
|
Posted: Thu Feb 10, 2005 4:48 pm Post subject: Effacer un element d'une liste |
|
|
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
|
Posted: Thu Feb 10, 2005 5:05 pm Post subject: Re: Effacer un element d'une liste |
|
|
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
|
Posted: Thu Feb 10, 2005 6:14 pm Post subject: Re: Effacer un element d'une liste |
|
|
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()
{
if (on doit supprimer l'élément)
{
ma_liste.erase (i++);
}
else
{
++i;
}
}
--
;-)
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Thu Feb 10, 2005 9:07 pm Post subject: Re: Effacer un element d'une liste |
|
|
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
|
Posted: Thu Feb 10, 2005 10:08 pm Post subject: Re: Effacer un element d'une liste |
|
|
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
|
Posted: Thu Feb 10, 2005 11:38 pm Post subject: Re: Effacer un element d'une liste |
|
|
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
|
Posted: Fri Feb 11, 2005 9:48 am Post subject: Re: Effacer un element d'une liste |
|
|
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
|
Posted: Fri Feb 11, 2005 12:14 pm Post subject: Re: Effacer un element d'une liste |
|
|
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
|
Posted: Fri Feb 11, 2005 12:15 pm Post subject: Re: Effacer un element d'une liste |
|
|
[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
|
Posted: Fri Feb 11, 2005 2:25 pm Post subject: Re: Effacer un element d'une liste |
|
|
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
|
Posted: Fri Feb 11, 2005 5:27 pm Post subject: Re: Effacer un element d'une liste |
|
|
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
|
Posted: Sat Feb 12, 2005 6:48 pm Post subject: Re: Effacer un element d'une liste |
|
|
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
|
Posted: Sun Feb 13, 2005 9:41 pm Post subject: Re: Effacer un element d'une liste |
|
|
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
|
Posted: Sun Feb 13, 2005 9:46 pm Post subject: Re: Effacer un element d'une liste |
|
|
[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
|
Posted: Sun Feb 13, 2005 10:22 pm Post subject: Re: Effacer un element d'une liste |
|
|
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 |
|
 |
|