[C/C++] fonction sort() avec STL

fonction sort() avec STL [C/C++] - C++ - Programmation

Marsh Posté le 30-05-2003 à 14:53:59    

Salut a ts g un petit probleme avec la fonction sort
 

Code :
  1. class Arc
  2. {
  3. private:
  4.   //Le pointeur sur les sommets
  5.   Sommet * som1 ;
  6.   Sommet * som2 ;
  7.   //Le numero de l'arc
  8.   int info ;
  9.   //La valeur de l'arc
  10.   int valeur ;
  11.   friend class Sommet ;
  12.   friend class Graphe ;
  13. }


 
g surchargé l'operateur  <
 

Code :
  1. bool Arc::operator<(Arc a)
  2. {
  3.   a.valeur << endl ;
  4.   if( valeur < a.valeur )
  5.        return true ;
  6.   else
  7.        return false ;
  8. }


 
et je veux trier cette liste
 

Code :
  1. //Liste temporaire de pointeurs d'arcs
  2. list<Arc *> temparcs ;


 
que j'essaie de trier comme ca :
 

Code :
  1. temparcs.sort() ;


 
et je comprend pas ca ne tri rien du tout !
 
est ce que g mal defini mon operateur ou autres choses ?
 
Help plz


Message édité par trmassoud le 30-05-2003 à 15:39:28
Reply

Marsh Posté le 30-05-2003 à 14:53:59   

Reply

Marsh Posté le 30-05-2003 à 16:55:02    

Ben ça doit trier les pointeurs :D

Reply

Marsh Posté le 30-05-2003 à 18:29:35    

utilise la version de sort() avec un objet fonction pour le critére de comparaison

Reply

Marsh Posté le 30-05-2003 à 18:33:49    

gloop a écrit :

utilise la version de sort() avec un objet fonction pour le critére de comparaison
 

ben pourquoi? on fait ça seulement si le critere differe du sémantiquement le plus correcte

Reply

Marsh Posté le 30-05-2003 à 19:17:27    

desole mais je ne comprend pas tout ce que vous me dites  :cry:  
 
si g bien compris verdoux ?
 
ma liste contient des pointeurs vers des arcs et donc si je surcharge mon operateur < entre des arcs ca ne sert a rien ?
 
il faudrait que je creer un fonction qui compare des pointeurs d'arcs ? et que je la passe en argument de sort ?  
 

Code :
  1. bool Arc::comparePointeurArcs(Arc *a)
  2. {
  3. if (this->valeur<a->valeur)
  4.     return true ;
  5. else return false ;
  6. }


 
mais ca, ca va pas passer parce que ce qui est represente par "this" n'est pas un pointeur vers un arc ?
 
comment je fais alors ?
 
dsl gloop et taz mais je comprend pas ce que vous me dites -> cause MOI en C++ =  [:madyodaseb]  
 
si vous pouviez m'eclaircir ?

Reply

Marsh Posté le 30-05-2003 à 20:12:34    

1) t'es sur d'aoir besoin de pointeur?
2) si oui, tu surcharges
bool operator<(consr Arc *a, const Arc *b)
{ return *a<*b;}


Message édité par Taz le 30-05-2003 à 20:44:43
Reply

Marsh Posté le 30-05-2003 à 20:21:08    

++Taz a écrit :

1) t'es sur d'aoir besoin de pointeur?
2) si oui, tu surcharges
bool operator<(consr Arc *a, const Arc *b)
{ return *a<*b;}


 
merci ++Taz
 
1) oui je suis obliger car dans ma structure de donnees les arcs sont deja stocker qqpart et il faut que jevite la duplication d'information ;)
2) je vais essayer !
 et merci je ne connaisais pas ca : si g bien compris ca va comparer pointeur_vers_arcs1 < pointeur_vers_arcs1  ?


---------------
Allez doucement n'empèche pas d'arriver !
Reply

Marsh Posté le 30-05-2003 à 20:29:32    

Arf le compilo il me dit que la surcharge de l'operateur doit prendre exclusivement un seul argument :(
 
 :heink:

Reply

Marsh Posté le 30-05-2003 à 20:44:14    

putain, j'ai encore dit n'importe quoi moi je suis trop fatigué [:the grosminet]
 
désolé. voici un exemple fonctionnel et complet
 

Code :
  1. #include <list>
  2. struct Foo
  3. {
  4.   int i;
  5. };
  6. bool operator<(const Foo &a, const Foo &b)
  7. {
  8.   return a.i < b.i;
  9. }
  10. class LessFooPtr
  11. {
  12. public:
  13.   bool operator()(const Foo *a, const Foo *b) const
  14.   {
  15.     return *a < *b;
  16.   }
  17. };
  18. int main()
  19. {
  20.   Foo a, b;
  21.   a < b;
  22.   std::list<Foo *> l;
  23.   // t'y mets ce que tu veux ..
  24.   // et la tu passes un objet fonction qui sera chargé de faire la comparaison
  25.   // que de souplesse
  26.   l.sort(LessFooPtr());
  27. }


Message édité par Taz le 30-05-2003 à 20:46:32
Reply

Marsh Posté le 30-05-2003 à 20:50:11    

et on peut encore améliorer avec une meilleure définition du comparateur
 

Code :
  1. #include <functional>
  2. class LessFooPtr : public std::binary_function< const Foo *, const Foo *, bool >
  3. {
  4. public:
  5.   bool operator()(const Foo *a, const Foo *b) const
  6.   {
  7.     return *a < *b;
  8.   }
  9. };


Reply

Marsh Posté le 30-05-2003 à 20:50:11   

Reply

Marsh Posté le 30-05-2003 à 20:52:07    


 
ca marche pas ca :(
 
en fait faudrait que je fasse savoir a la fonction sort() que pour comparer les elements de ma liste (qui est une liste dde pointeurs vers des arcs) elle compare la variable valeur des arcs qui sont pointés.
 
mais ca pour le faire :((
 


---------------
Allez doucement n'empèche pas d'arriver !
Reply

Marsh Posté le 30-05-2003 à 21:23:33    

Code :
  1. #include <list>
  2. #include <functional>
  3. struct Foo
  4. {
  5.   int i;
  6. };
  7. bool operator<(const Foo &a, const Foo &b)
  8. {
  9.   return a.i < b.i;
  10. }
  11. class LessFooPtr : public std::binary_function< const Foo *, const Foo *, bool >
  12. {
  13. public:
  14.   bool operator()(const Foo *a, const Foo *b) const
  15.   {
  16.     return *a < *b;
  17.   }
  18. };
  19. template<class T>
  20. class LessPtr : public std::binary_function< const T *, const T *, bool >
  21. {
  22. public:
  23.   bool operator()(const T *a, const T *b) const
  24.   {
  25.     return *a < *b;
  26.   }
  27. };
  28. template<class T>
  29. bool LessPtrFx(const T *a, const T *b)
  30. {
  31.   return *a < *b;
  32. }
  33. int main()
  34. {
  35.   Foo a, b;
  36.  
  37.   a < b;
  38.   std::list<Foo *> l;
  39.   l.sort(LessFooPtr());
  40.   l.sort(LessPtr<Foo>());
  41.   l.sort(std::ptr_fun(&LessPtrFx<Foo> ));
  42. }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed