Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2956 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Classes, Vecteurs et Tri...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Classes, Vecteurs et Tri...

n°1196745
Bapt_from_​reims
truc de ouf la nan ? :p
Posté le 10-09-2005 à 20:15:56  profilanswer
 

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 =)

mood
Publicité
Posté le 10-09-2005 à 20:15:56  profilanswer
 

n°1196800
Taz
bisounours-codeur
Posté le 10-09-2005 à 22:42:27  profilanswer
 

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

n°1196938
Bapt_from_​reims
truc de ouf la nan ? :p
Posté le 11-09-2005 à 11:59:13  profilanswer
 

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

n°1197172
Taz
bisounours-codeur
Posté le 11-09-2005 à 18:01:51  profilanswer
 

tu veux pas nous donner ton Makefile ?

n°1197175
Bapt_from_​reims
truc de ouf la nan ? :p
Posté le 11-09-2005 à 18:12:50  profilanswer
 

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)

n°1197187
Bapt_from_​reims
truc de ouf la nan ? :p
Posté le 11-09-2005 à 18:29:23  profilanswer
 

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
n°1197203
Taz
bisounours-codeur
Posté le 11-09-2005 à 18:58:48  profilanswer
 

ç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

n°1197250
Bapt_from_​reims
truc de ouf la nan ? :p
Posté le 11-09-2005 à 20:18:01  profilanswer
 

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.

n°1197252
KangOl
Profil : pointeur
Posté le 11-09-2005 à 20:25:26  profilanswer
 

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...
n°1199412
jesus_chri​st
votre nouveau dieu
Posté le 14-09-2005 à 15:25:01  profilanswer
 

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 ?

mood
Publicité
Posté le 14-09-2005 à 15:25:01  profilanswer
 

n°1199687
Taz
bisounours-codeur
Posté le 14-09-2005 à 20:41:50  profilanswer
 

ç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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Classes, Vecteurs et Tri...

 

Sujets relatifs
[C#] Problème d'instanciation de classes et usage de la class DebugTri d'un tableeau mutlidimentionnel - A n'y plus rien comprendre !!?
Tri multi tableaux[Visual C++] Classes filles de CException
prob acces membres de classes pour fichier inclus en path absoluImporter une bibliothèque de classes
heritage de classesAPI / Classes ASN.1 Java ???
Include PHP et Classes[C# .NET] Classes, héritage, 3D
Plus de sujets relatifs à : Classes, Vecteurs et Tri...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR