liste d'objet et sort

liste d'objet et sort - C++ - Programmation

Marsh Posté le 14-01-2005 à 12:49:25    

Bonjour  :hello:  
 
j'ai une liste de personne
 

Code :
  1. class personne
  2. {
  3.   public :
  4.     string nom, prenom;
  5. ...
  6. }


 
et j'aimerai pouvoir faire un sort dessus, et bien evidemment, ca ne marche pas   :o  
 
autre probleme, qui doit etre le meme, j'ai du mal à faire que le find_if fonctionne, j'ai reussi a le faire fonctionner, en faisant une classe avec un bool operator () qui teste si le nom est egual a un string, mais je dois mettre le string en 'dur' dans le code  :sweat:  
 
 
je sais pas si c'est super clair ...
 
 
 
thx  :jap:


---------------
.
Reply

Marsh Posté le 14-01-2005 à 12:49:25   

Reply

Marsh Posté le 14-01-2005 à 13:45:36    

définis
 
bool operator<(const Personne &a, const Personne &b);

Reply

Marsh Posté le 14-01-2005 à 14:03:28    

Taz a écrit :

définis
 
bool operator<(const Personne &a, const Personne &b);


 
 
j'avais vu, ici ou sur un site, cette solution, mais il m'indique :
 
'binary operator <' has too many parameters
 


---------------
.
Reply

Marsh Posté le 14-01-2005 à 14:10:48    

qui t'as dit de le mettre en fonction membre ?

Reply

Marsh Posté le 14-01-2005 à 14:13:32    

Code :
  1. friend bool operator<(const personne &a, const personne &b);


 
edit: grillé :)


Message édité par SomeBugsInMe le 14-01-2005 à 14:14:13
Reply

Marsh Posté le 14-01-2005 à 14:13:37    

Taz a écrit :

qui t'as dit de le mettre en fonction membre ?


 
[:ddr555]
 
merci  :D  
 
je sais pas pourquoi je m'obstinais à le mettre en methode  :sweat:  
 
enfin, ca marche, merci à toi  :hello:


---------------
.
Reply

Marsh Posté le 14-01-2005 à 14:28:27    

SomeBugsInMe a écrit :

Code :
  1. friend bool operator<(const personne &a, const personne &b);


 
edit: grillé :)


tu veux mon pied dans la gueule ? d'ou tu as besoin d'un friend :o
friend c'est mal.

Reply

Marsh Posté le 14-01-2005 à 14:42:25    

Taz a écrit :

tu veux mon pied dans la gueule ? d'ou tu as besoin d'un friend :o
friend c'est mal.


et toi tu veux mon poing dans la gueule?

Code :
  1. class Foo
  2. {
  3.  int foo;
  4. public:
  5.  Foo(int _foo) : foo(_foo) {}
  6.  friend bool operator<(const Foo &a, const Foo &b);
  7. };
  8. bool operator<(const Foo &a, const Foo &b)
  9. {
  10. return a.foo<b.foo;
  11. }



---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 14-01-2005 à 16:44:56    

j'ai peut-être pas été clair.
 
Je voulais dire comme schnapsmann.

Reply

Marsh Posté le 14-01-2005 à 22:34:30    

friend c'est mal :o. La comparaison n'est pas une opération interne en plus :o

Reply

Marsh Posté le 14-01-2005 à 22:34:30   

Reply

Marsh Posté le 14-01-2005 à 22:38:13    

Taz a écrit :

friend c'est mal :o. La comparaison n'est pas une opération interne en plus :o


 
meme par 'soucis de clarté', cue que on redefini l'operateur '<' pour la classe personne, ca me semblait logique de le mettre dans la classe, mais en friend.


---------------
.
Reply

Marsh Posté le 15-01-2005 à 00:31:30    

ça n'a rien de clair. Tu est même obligé de foutre en l'air ton encapsulation avec un friend ... c'est clair ...

Reply

Marsh Posté le 15-01-2005 à 01:04:55    

Code :
  1. #include <string>
  2. using std::string;
  3. class Personne
  4. {
  5.   bool less(const Personne &other) const;
  6. private:
  7.   string nom, prenom;
  8. }
  9. bool Personne::less(const Personne &other) const
  10. {
  11.   // ...
  12.   return true;
  13. }
  14. inline bool operator<(const Personne &left, const Personne &right)
  15. {
  16.   return left.less(right);
  17. }


Message édité par Taz le 15-01-2005 à 10:33:37
Reply

Marsh Posté le 15-01-2005 à 02:29:19    

pq c'est pas bien en tant que fonction membre ?

Reply

Marsh Posté le 15-01-2005 à 10:21:44    

Taz a écrit :

ça n'a rien de clair. Tu est même obligé de foutre en l'air ton encapsulation avec un friend ... c'est clair ...


 
il me semblais, mea culpa comme on dis alors ;)


---------------
.
Reply

Marsh Posté le 15-01-2005 à 10:25:45    

push a écrit :

pq c'est pas bien en tant que fonction membre ?


La surcharge des operateurs ne passe pas bien en fonction membre généralement à cause des convertions implicites qui ne marchent plus alors sur le membre de gauche.

Reply

Marsh Posté le 17-01-2005 à 15:39:01    

Comme j'avais des problèmes de tri similaires avec STL, j'ai suivi avec intérêt ce post. Cependant, pourquoi peut-il être intéressant d'utiliser le inline dans l'expression :
 
inline bool operator<(const Personne &left, const Personne &right)  
 
comme Taz l'a écrit précédemment.
 
Est-ce que cela pose un problème si on ne l'utilise pas ? Dans le cas que j'ai programmé pour mon travail, l'absence de inline ne pose pas de problème.

Reply

Marsh Posté le 17-01-2005 à 17:29:32    

...

Reply

Marsh Posté le 17-01-2005 à 19:17:38    

Bon, c'est concis !
 
En fait, comme je l'ai dit, je suis intéressé par réaliser des tris dans des list avec STL et sort(). Le problème que je rencontre est que je n'ai pas des listes d'objet mais de pointeur sur des objets. Ainsi, quand je veux définir l'opérateur < pour deux pointeurs Article* , j'écrit :
 
bool operator<(Article* &left,Article* &right)
{
  return (left->prix()<right->prix());
}
 
Malheureusment, à la compil, j'ai une erreur :
 
e:\monchemin\Article.cpp(6) : error C2803: 'operator <' must have at least one formal parameter of class type
 
Est ce que cela veut dire que je suis obligé de passer par les foncteurs (car il doit être possible de trier des éléments par un objet foncteur, je crois) ?
Y a-t'il plus simple que l'utilisation de ce foncteur ?

Reply

Marsh Posté le 17-01-2005 à 20:22:07    

1) pas de surcharge pour les pointeurs
2) ça manque de const
3) tu peux inliner
4) défini un objet-fonction (ou une fonction) que tu passe en paramètre à std::sort

Reply

Marsh Posté le 17-01-2005 à 22:10:06    

Taz a écrit :

Code :
  1. #include <string>
  2. using std::string;
  3. class Personne
  4. {
  5.   bool less(const Personne &other) const;
  6. private:
  7.   string nom, prenom;
  8. }
  9. bool Personne::less(const Personne &other) const
  10. {
  11.   // ...
  12.   return true;
  13. }
  14. inline bool operator<(const Personne &left, const Personne &right)
  15. {
  16.   return left.less(right);
  17. }



 
 
manque pas un ptit public: (ou struct) et un ; a la fin de la déclaration de classe ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 17-01-2005 à 22:23:53    

oui

Reply

Marsh Posté le 18-01-2005 à 08:15:29    

Ok, merci Taz de ces indications.
Quand tu donnes ton conseil 4, c'est justement la définition d'un foncteur, non ? En fait, ce foncteur est l'argument à passer en paramètre qui va servir au tri ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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