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 

stl : tri d'élément selon un membre.

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





PostPosted: Fri Jul 07, 2006 7:29 pm    Post subject: stl : tri d'élément selon un membre. Reply with quote



Je suis en train d'éclaircir/nettoyer mon code et j'aimerais savoir
s'il existe une ligne de code permettant de trier une liste selon un
membre donné, sans utiliser de foncteur.
Exemple :
struct foo {
int ID;
int taille;
float poids;
};

list<foo> malist;
// on remplit malist.

comment la trier par taille ? Avec foncteur, je sais faire. Mais avec
des bind, des mem_fun_ref et du greater, je ne vois pas comment faire.

Je me pose la même question pour une recherche de maximum par exemple
(quel est l'ID ayant la plus grande taille ?)

J'ai jeté un coup d'oeil à la faq, j'ai (beaucoup) cherché avec
google... sans succès.
Alors, je m'en remets à une âme charitable.

ALB
Back to top
Fabien LE LEZ
Guest





PostPosted: Fri Jul 07, 2006 8:29 pm    Post subject: Re: stl : tri d'élément selon un membre. Reply with quote



On 7 Jul 2006 07:29:11 -0700, "ALB" <lebatteux (AT) crans (DOT) org>:

Quote:
s'il existe une ligne de code permettant de trier une liste selon un
membre donné, sans utiliser de foncteur.

Certes : tu peux utiliser une fonction à la place du foncteur.
Back to top
ALB
Guest





PostPosted: Fri Jul 07, 2006 8:54 pm    Post subject: Re: stl : tri d'élément selon un membre. Reply with quote



Fabien LE LEZ a écrit :

Quote:
Certes : tu peux utiliser une fonction à la place du foncteur.

C'est vrai. Mais, je ne souhaite pas faire ça non plus.

En fait, utiliser des foncteurs et des fonctions obligent à les
définir avant de les utiliser, ce qui, je trouve encombre le code
inutilement dans la mesure où je ne les utilise généralement qu'une
seule fois.

Et puis, je suis assez convaincu qu'on doit pouvoir se débrouiller en
composant les bind, les mem_fun et un greater<>. Mais, je ne réussis
pas à le faire sans erreur (et ça commence à n'enerver... )

ALB
Back to top
Fabien LE LEZ
Guest





PostPosted: Fri Jul 07, 2006 9:01 pm    Post subject: Re: stl : tri d'élément selon un membre. Reply with quote

On 7 Jul 2006 08:54:00 -0700, "ALB" <lebatteux (AT) crans (DOT) org>:

Quote:
Et puis, je suis assez convaincu qu'on doit pouvoir se débrouiller en
composant les bind, les mem_fun et un greater<>.

C'est possible. Par contre, je ne suis pas convaincu que le résultat
soit lisible.
Back to top
ALB
Guest





PostPosted: Fri Jul 07, 2006 9:37 pm    Post subject: Re: stl : tri d'élément selon un membre. Reply with quote

Fabien LE LEZ a écrit :

Quote:
C'est possible. Par contre, je ne suis pas convaincu que le résultat
soit lisible.

j'aimerais bien voir, histoire de me faire mon idée...
Back to top
Cyrille
Guest





PostPosted: Sat Jul 08, 2006 2:02 am    Post subject: Re: stl : tri d'élément selon un memb re. Reply with quote

ALB a écrit :
Quote:
Je suis en train d'éclaircir/nettoyer mon code et j'aimerais savoir
s'il existe une ligne de code permettant de trier une liste selon un
membre donné, sans utiliser de foncteur.
Exemple :
struct foo {
int ID;
int taille;
float poids;
};

list<foo> malist;
// on remplit malist.

comment la trier par taille ? Avec foncteur, je sais faire. Mais avec
des bind, des mem_fun_ref et du greater, je ne vois pas comment faire.

Je me pose la même question pour une recherche de maximum par exemple
(quel est l'ID ayant la plus grande taille ?)

J'ai jeté un coup d'oeil à la faq, j'ai (beaucoup) cherché avec
google... sans succès.
Alors, je m'en remets à une âme charitable.

Avec boost::bind, ça marche relativement bien, si je ne me trompe pas:

maliste.sort(boost::bind(std::less<int>(),
boost::bind(&foo::ID, _1),
boost::bind(&foo::ID, _2)));

maliste.sort(boost::bind(std::less<float>(),
boost::bind(&foo::poids, _1),
boost::bind(&foo::poids, _2)));

list<foo>::iterator le_plus_grand =
std::max_element(maliste.begin(), maliste.end(),
boost::bind(std::less<int>(),
boost::bind(&foo::taille, _1),
boost::bind(&foo::taille, _2)));

Par contre, je ne sais pas comment enlever la répétition de la référence
du membre.

--
C'est ma signature qu'elle est la mieux. Pas la vôtre.
Back to top
Arnaud Debaene
Guest





PostPosted: Sat Jul 08, 2006 2:22 pm    Post subject: Re: tri d'élément selon un membre. Reply with quote

"ALB" <lebatteux (AT) crans (DOT) org> a écrit dans le message de news:
1152282551.846929.73180 (AT) m73g2000cwd (DOT) googlegroups.com...
Quote:
struct foo {
int ID;
int taille;
float poids;
};

list<foo> malist;
// on remplit malist.

comment la trier par taille ? Avec foncteur, je sais faire. Mais avec
des bind, des mem_fun_ref et du greater, je ne vois pas comment faire.

Avec la librairie standard, ca risque d'être assez illisible, mieux vaut
utiliser un foncteur classique. Par contre, avec boost::bind (qu'on peut
espérer voir intégrer dans la prochaine mouture de la norme), ca devient
simplissime :

#include <boost/bind.hpp>
using namespace boost;

list<foo> malist;
// on remplit malist.

malist.sort( bind(&foo::poids, _1) < bind (&foo::poids, _2));
//liste triée par taille

malist.sort( bind(&foo::taille, _1) < bind (&foo::taille, _2));
//liste triée par poids

Un autre approche qui pourrait t'intéresser (selon tes besoins) serait
d'utiliser boost::multi_index à la place de std::list pour avoir en
permanence plusieurs indexs sur ta collection.

Arnaud
Back to top
ALB
Guest





PostPosted: Sat Jul 08, 2006 4:45 pm    Post subject: Re: tri d'élément selon un membre. Reply with quote

c'est vrai que boost (que j'ai croisé ça et là, sans trop m'y
arreter pour l'instant) a l'air de permettre d'écrire les choses
clairement. C'est assez séduisant.
J'ai effectivement lu que cette librairie était sur le bon chemin pour
être intégrée au standard, mais un peu buté (enfin, je préfère
dire puriste), je voulais me limiter à l'utilisation de la stl. Je
souhaite que mon code soit portable et léger (bon avec la stl, il y a
déjà un premier serieux boulet).

Je vous remercie pour vos réponses.
ALB
Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Jul 08, 2006 5:39 pm    Post subject: Re: tri d'élément selon un membre. Reply with quote

On 8 Jul 2006 04:45:57 -0700, "ALB" <lebatteux (AT) crans (DOT) org>:

Quote:
Je souhaite que mon code soit portable

Qu'entends-tu par "portable" exactement ?
Boost fonctionne sur la plupart des compilos récents.

Si tu veux porter ton code sur un compilo ancien et/ou pourri, tu
auras effectivement des problèmes -- mais pas seulement avec Boost.

Quote:
et léger

Qu'entends-tu par "léger" ?
Back to top
Arnaud Debaene
Guest





PostPosted: Sat Jul 08, 2006 7:36 pm    Post subject: Re: tri d'élément selon un membre. Reply with quote

"ALB" <lebatteux (AT) crans (DOT) org> a écrit dans le message de news:
1152359157.507478.8260 (AT) p79g2000cwp (DOT) googlegroups.com...
c'est vrai que boost (que j'ai croisé ça et là, sans trop m'y
arreter pour l'instant) a l'air de permettre d'écrire les choses
clairement. C'est assez séduisant.
J'ai effectivement lu que cette librairie était sur le bon chemin pour
être intégrée au standard, mais un peu buté (enfin, je préfère
dire puriste), je voulais me limiter à l'utilisation de la stl.

A mon avis, ce n'est pas faisable avec les binders de la STL, parce que les
classes mem_fun_t, mem_fun_ref_t, etc.... ansi que binder1st et binder2nd ne
fonctionnent qu'avec des fonctions membres, pas avec des données membres :
je ne vois donc pas comment référencer &foo::taille dans une expression qui
utiliserait ces classes (Ah là là, les pointeurs vers *données* membres!
J'avais oublié que ca existait Wink.

Arnaud
Back to top
ALB
Guest





PostPosted: Sun Jul 09, 2006 9:11 am    Post subject: Re: tri d'élément selon un membre. Reply with quote

Arnaud Debaene a écrit :

Quote:
A mon avis, ce n'est pas faisable avec les binders de la STL, parce que les
classes mem_fun_t, mem_fun_ref_t, etc.... ansi que binder1st et binder2nd ne
fonctionnent qu'avec des fonctions membres, pas avec des données membres :
je ne vois donc pas comment référencer &foo::taille dans une expression qui
utiliserait ces classes (Ah là là, les pointeurs vers *données* membres!
J'avais oublié que ca existait Wink.

Arnaud

avec un
int foo::Gettaille() { return taille;};
Back to top
James Kanze
Guest





PostPosted: Sun Jul 09, 2006 7:21 pm    Post subject: Re: stl : tri d'élément selon un memb re. Reply with quote

ALB wrote:
Quote:
Fabien LE LEZ a écrit :

Certes : tu peux utiliser une fonction à la place du foncteur.

C'est vrai. Mais, je ne souhaite pas faire ça non plus.

En fait, utiliser des foncteurs et des fonctions obligent à
les définir avant de les utiliser, ce qui, je trouve encombre
le code inutilement dans la mesure où je ne les utilise
généralement qu'une seule fois.

Je ne suis pas sûr que j'ai bien compris, mais tu veux trier une
liste sans dire les critères de tri aux compilateur. Ça ne me
semble pas très logique.

--
James Kanze kanze.james (AT) neuf (DOT) fr
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
Fabien LE LEZ
Guest





PostPosted: Sun Jul 09, 2006 7:25 pm    Post subject: Re: stl : tri d'élément selon un membre. Reply with quote

On Sun, 09 Jul 2006 16:21:23 +0200, James Kanze <kanze.james (AT) neuf (DOT) fr>:

Quote:
Je ne suis pas sûr que j'ai bien compris

Je ne suis pas sûr non plus Wink
Tu as des circonstances atténuantes, puisque l'énoncé du problème est
faux.

En fait, l'OP semble vouloir un foncteur généré automatiquement à coup
de "bind".
Back to top
ALB
Guest





PostPosted: Mon Jul 10, 2006 2:16 am    Post subject: Re: stl : tri d'élément selon un membre. Reply with quote

Fabien LE LEZ a écrit :

Quote:
On Sun, 09 Jul 2006 16:21:23 +0200, James Kanze <kanze.james (AT) neuf (DOT) fr>:

Je ne suis pas sûr que j'ai bien compris

Je ne suis pas sûr non plus Wink
Tu as des circonstances atténuantes, puisque l'énoncé du problème est
faux.

Je viens de le relire, et oui, c'est vrai, l'énoncé est mal exprimé
et donc faux.

Quote:
En fait, l'OP semble vouloir un foncteur généré automatiquement à coup
de "bind".

Exactement ! (pour être précis, à coup de bind1st et bind2nd).
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.