Classes, Vecteurs et Tri...

Classes, Vecteurs et Tri... - C++ - Programmation

Marsh Posté le 10-09-2005 à 20:15:56    

Slt tout le monde, j'ai un pb avec les tris sur une classe, je m'explique :
J'ai une classe Catalogue qui contient (en champ privé) un vector d'Article (Article étant un autre type type défini dans une autre classe Article).
Article contient en champ protected : string libelle, reference et un float pr le prix.
Lors de l'affichage du catalogue, j'aimerais trier les articles sur le libelle de l'article.
J'utilise donc la methode sort() de la STL comme ceci :
 

Code :
  1. class Catalogue
  2. {
  3. private:
  4.  vector<Article> v;
  5. public:
  6.  Catalogue(){}
  7.  void add(Article a)
  8.  {
  9.   v.push_back(a);
  10.  }
  11.  void affiche()
  12.  {
  13.                /*vector<Article>::iterator it;
  14.               for(it = v.begin(); it != v.end() ; it++)
  15.                  cout << *it.desc() << endl;
  16.          */
  17.           for(int i = 0 ; i < v.size() ; i++)
  18.    cout << v.desc() << endl;
  19.  }
  20.         void tri()
  21.  {
  22.   sort(v.begin(), v.end());
  23.  }
  24. };


 
je vois bien que dans mon void [i]tri(), sort() ne peut pas trier ma classe article, vu que je ne lui dis pas de prendre le champ libelle
Comment est-ce que je peux procéder??
 
A noter que j'ai bien "surchargé" (je crois qu'on dit comme sa) l'opérateur < dans la classe Article pr utiliser sort()
 --> Please Help =)

Reply

Marsh Posté le 10-09-2005 à 20:15:56   

Reply

Marsh Posté le 10-09-2005 à 22:42:27    

et le critère de tri, c'est la longueur du libelle puissance le prix ?

Reply

Marsh Posté le 11-09-2005 à 11:59:13    

Oula non! le tri s'effectue sur le libelle tri sur une string, dsl j'avais pas précisé ;)

Reply

Marsh Posté le 11-09-2005 à 18:01:51    

tu veux pas nous donner ton Makefile ?

Reply

Marsh Posté le 11-09-2005 à 18:12:50    

reSlt, j'ai pas de makefile, ms je peux mieux m'expliquer en moins de mots :

Code :
  1. /* Le problème :
  2.    Comment trier les "instances d'une classe" contenues
  3.    dans un vector, sur un champ privé (libelle) de cette
  4.    classe, avec la méthode sort() de la STL ?
  5.    
  6.    Idée :  
  7.    Créer un autre vector contenant ce champ privé
  8.    à trier et le trier (car on peut utiliser sort()
  9.    avec un type 'String' mais pas 'Article')
  10.    (Ou alors il fallait juste implémenter tous les Operator)
  11.    
  12.    Nouveau dilemme :
  13.    Les libelles sont triés (en théorie) dans le nouveau
  14.    vector, il faut maintenant trier le catalogue...
  15.    
  16.    Idée :
  17.    Créer un autre vector temporaire d'articles dans le même
  18.    ordre que celui qu'on vient de trier et le réaffecter
  19.    au premier vector (catalogue)
  20.    Refaire des accesseurs pour tous les champs privés de
  21.    la classe pour la reaffectation dans l'ordre
  22.    (C'est le foin? mais non!)
  23.    
  24.    Conclusion :
  25.    La Méthode sort() pue du fion et vive nos algos !
  26.    
  27.    Epilogue :
  28.    "Et qu'est-ce que tu penses de l'héritage privé ?"
  29.    "0n l'a pas vu en cours pourquoi ..." ... "!@#%*"
  30.   */


 
Non plus sérieusement, le problème est décris dans le début de ce petit quote, et je me demande si ça serait pas mieux ou plus utile d'utiliser l'héritage privé si il s'agit bien de ce que je pense... ^o)

Reply

Marsh Posté le 11-09-2005 à 18:29:23    

C'est bon j'ai réussi en bidouillant (en faisant ce que j'ai écris au dessus de ce post)... mais je me demande si il y a pas plus simple quand même...
Si ça intéresse qqun :  
 

Code :
  1. #include <algorithm>
  2. #include <string>
  3. #include <vector>
  4. #include <iostream>
  5. using namespace std;
  6. class Article
  7. {
  8. protected:
  9.  string libelle, reference;
  10.  float prix;
  11. public:
  12.  Article(string l, string r, float p) : libelle(l), reference(r), prix(p){}
  13.  void desc()
  14.  {
  15.   cout << "Libelle : " << this->libelle << "\tReference : " << this->reference << "\tPrix : " << this->prix << endl;
  16.  }
  17.  bool operator < (Article a)
  18.  {
  19.   return this->libelle < a.libelle;
  20.  }
  21.  bool operator > (Article a)
  22.  {
  23.   return this->libelle > a.libelle;
  24.  }
  25.  bool operator == (Article a)
  26.  {
  27.   return this->libelle == a.libelle;
  28.  }
  29.  string getLibelle()
  30.  {
  31.             return this->libelle;
  32.  }
  33.  string getReference()
  34.  {
  35.   return this->reference;
  36.  }
  37.  float getPrix()
  38.  {
  39.   return this->prix;
  40.  }
  41. };
  42. class Catalogue
  43. {
  44. private:
  45.  vector<Article> v;
  46. public:
  47.  Catalogue(){}
  48.  void add(Article a)
  49.  {
  50.   v.push_back(a);
  51.  }
  52.  void affiche()
  53.  {
  54.   /*
  55.   vector<Article>::iterator it;
  56.             for(it = v.begin(); it != v.end() ; it++)
  57.              cout << *it.desc() << endl;
  58.             */
  59.             for(int i = 0 ; i < v.size() ; i++)
  60.    v[i].desc();
  61.  }
  62.         void tri()
  63.  {
  64.   // cf. commentaires à la fin du fichier
  65.   vector<string> tmp;
  66.   for(int i = 0 ; i < v.size() ; i++)
  67.    tmp.push_back(v[i].getLibelle());
  68.   sort(tmp.begin(), tmp.end());
  69.   /*for(int show = 0 ; show < tmp.size() ; show ++)
  70.    cout << tmp[show] << endl;
  71.   */
  72.   vector<Article> art;
  73.   string ref_tmp;
  74.   float prix_tmp;
  75.   for(int k = 0 ; k < tmp.size() ; k++)
  76.   {
  77.    for(int j = 0; j < v.size() ; j++)
  78.    {
  79.     if( tmp[j] == v[k].getLibelle() )
  80.     {
  81.      ref_tmp = v[k].getReference();
  82.      prix_tmp = v[k].getPrix();
  83.    }
  84.    }
  85.    art.push_back(Article(tmp[k], ref_tmp, prix_tmp));
  86.   }
  87.   v = art;
  88.  }
  89. };
  90. int main()
  91. {
  92. Stylo s("libelle stylo", "ref stylo", 10, "rouge" );
  93. s.desc();
  94. Article a1("lib art1", "ref art1", 10);
  95. Article a2("lib art2", "ref art2", 12);
  96. Article a3("test art3", "ref art3", 1);
  97. Article a4("a", "art4", 2);
  98. Catalogue c;
  99. c.add(a1);
  100. c.add(a2);
  101. c.add(a3);
  102. c.add(a4);
  103. cout << endl << "Affichage du Catalogue avant le tri : " << endl;
  104. c.affiche();
  105. cout << endl << "Affichage apres le tri : " << endl;
  106. c.tri();
  107. c.affiche();
  108. cin.get();
  109. return 0;
  110. }


Message édité par Bapt_from_reims le 11-09-2005 à 18:52:19
Reply

Marsh Posté le 11-09-2005 à 18:58:48    

ça y est tu te decide enfin à nous filer le code :o t'es pas futé toi ...
 
tous tes opérateurs sont mauvais. Au minimum leur signature doit être
 
bool Foo::operator??(const Foo &other) const;
 
toutes tes fonctions get (quels noms de merde !) doivent aussi être marquées const

Reply

Marsh Posté le 11-09-2005 à 20:18:01    

et le fait de rajouter 'const' à la fin me permet d'utiliser sort() sur ma classe Article (qui contient plusieurs types privés) ?!
Sa ne dit pas au prog sur quel champ je veux qu'il fasse le tri.. m'enfin...
merci de ton aide 'sympathique' et dsl je couche pas sur le forum pr répondre, sa ne date que d'hier.

Reply

Marsh Posté le 11-09-2005 à 20:25:26    

Bapt_from_reims a écrit :

et le fait de rajouter 'const' à la fin me permet d'utiliser sort() sur ma classe Article (qui contient plusieurs types privés) ?!
Sa ne dit pas au prog sur quel champ je veux qu'il fasse le tri.. m'enfin...
merci de ton aide 'sympathique' et dsl je couche pas sur le forum pr répondre, sa ne date que d'hier.


non c'est juste ce qu'on appelle "coder proprement" :o


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 14-09-2005 à 15:25:01    

bapt : c'est tes operateurs < et eventuellement == qui disent sur quels champs tu veux que se fasse le tri. Et les const sont très importants, c'est pas juste un style, ils doivent avoir la signature que donne Taz quand tu les mets en méthode.
 
A vu de nez (j'ai pas tout lu), avec des bons const (et mets aussi des bons passages par réference (c'est pas du java !)) ton
sort(v.begin(), v.end());
devrait marcher.
 
Taz : qu'est-ce t'as contre les methodes get/set ?

Reply

Marsh Posté le 14-09-2005 à 15:25:01   

Reply

Marsh Posté le 14-09-2005 à 20:41:50    

ça pue. surtout quand elles sont mal codées. C'est pas la peine d'écrire un get_() si tu sais pas ce qu'est un accesseur. Moi là je ne vois que des modifiers.
 
Et puis en C++, t'as qu'à quand même moyen de faire sans get/set
 
X Y::Member() const;
void Y::Member(const X & );
 
je trouve ça mieux. Corba fait comme ça d'ailleur.

Reply

Sujets relatifs:

Leave a Replay

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