 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
ALB Guest
|
Posted: Fri Jul 07, 2006 7:29 pm Post subject: stl : tri d'élément selon un membre. |
|
|
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
|
Posted: Fri Jul 07, 2006 8:29 pm Post subject: Re: stl : tri d'élément selon un membre. |
|
|
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
|
Posted: Fri Jul 07, 2006 8:54 pm Post subject: Re: stl : tri d'élément selon un membre. |
|
|
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
|
Posted: Fri Jul 07, 2006 9:01 pm Post subject: Re: stl : tri d'élément selon un membre. |
|
|
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
|
Posted: Fri Jul 07, 2006 9:37 pm Post subject: Re: stl : tri d'élément selon un membre. |
|
|
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
|
Posted: Sat Jul 08, 2006 2:02 am Post subject: Re: stl : tri d'élément selon un memb re. |
|
|
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
|
Posted: Sat Jul 08, 2006 2:22 pm Post subject: Re: tri d'élément selon un membre. |
|
|
"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
|
Posted: Sat Jul 08, 2006 4:45 pm Post subject: Re: tri d'élément selon un membre. |
|
|
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
|
Posted: Sat Jul 08, 2006 5:39 pm Post subject: Re: tri d'élément selon un membre. |
|
|
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.
Qu'entends-tu par "léger" ? |
|
| Back to top |
|
 |
Arnaud Debaene Guest
|
Posted: Sat Jul 08, 2006 7:36 pm Post subject: Re: tri d'élément selon un membre. |
|
|
"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 .
Arnaud |
|
| Back to top |
|
 |
ALB Guest
|
Posted: Sun Jul 09, 2006 9:11 am Post subject: Re: tri d'élément selon un membre. |
|
|
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 .
Arnaud
|
avec un
int foo::Gettaille() { return taille;}; |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Sun Jul 09, 2006 7:21 pm Post subject: Re: stl : tri d'élément selon un memb re. |
|
|
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
|
Posted: Sun Jul 09, 2006 7:25 pm Post subject: Re: stl : tri d'élément selon un membre. |
|
|
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
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
|
Posted: Mon Jul 10, 2006 2:16 am Post subject: Re: stl : tri d'élément selon un membre. |
|
|
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
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 |
|
 |
|
|
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
|
|