Trier un vector de pointeurs

Trier un vector de pointeurs - C++ - Programmation

Marsh Posté le 22-10-2005 à 00:57:23    

Salut,
 
     Voila j'ai une certaine classe abstraite Geom (dont ca classe fille Point) qui surcharge l'operateur < donc on peut comparer deux Point entre eux sans souci j'ai testé ca marche au top.
 

Code :
  1. /* Methode pour la surcharge de l'operateur < */
  2. bool Point::operator<(Geom &g)
  3. {
  4.   /* On tente de caster en Point * pour pouvoir comparer deux points*/
  5.   Point *p = dynamic_cast<Point *>(&g);
  6.   /* Si le cast a echoué c'est qu'on essaie de comparer
  7.      deux objets incomparables */
  8.   if (p == NULL){   
  9.     throw Mauvaise_Comparaison("Point avec inconnu" );
  10.   }
  11.   /* Si le cast reussi on effectue la comparaison selon le critere  
  12.      de comparaison entre deux points */
  13.   return ((x < p->x) || ((x == p->x) && (y < p->y)));
  14. }


 
    Mon but est de trier un vector de pointeurs sur Geom ...  
 
Dans le main :

Code :
  1. // Définition du foncteur servant à trier nos objets selon leur critere  
  2. struct MySort
  3. {
  4. bool operator ()(Geom *a1, Geom *a2) const
  5. {
  6.     return a1 < a2;
  7. }
  8. };
  9. int main(int argc, char *argv[])
  10. {
  11.     try{
  12.     //Declaration du vecteur
  13.     vector<Geom *> vector1(0);
  14.     //Remplissage du vecteur
  15.     vector1.push_back(new Point_l(2,2,150));
  16.     vector1.push_back(new Point_c(1,1,"rouge" ));
  17.     vector1.push_back(new Point(5,5));
  18.     vector1.push_back(new Point_c(3,3,"vert" ));
  19.     //Tri du vecteur
  20.     sort(vector1.begin(), vector1.end(), MySort());
  21.     cout << "Contenu du vecteur trie : " << endl;
  22.     for(int i = 0; i < vector1.size() ; i++){
  23.         if (vector1[i] != NULL)
  24.          cout << *(vector1[i]) << endl; 
  25.     }
  26.    
  27.     }
  28.     catch(exception &e)
  29.     {
  30.        cerr << e.what() << endl;
  31.     }
  32.     system("PAUSE" );
  33.     return EXIT_SUCCESS;
  34. }


 
Mais voila il trie rien du tout ou au mieux il en trie que les 2 premiers  :??:  
 
Je pige pas trop d'ou ca peut venir ...


Message édité par Chronoklazm le 22-10-2005 à 01:21:31

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 22-10-2005 à 00:57:23   

Reply

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

return a1 < a2;
 
tu compares des adresses. Le reste de ton code a une logique douteuse.

Reply

Marsh Posté le 22-10-2005 à 01:16:25    

mais non il est parfaitement logique mon code a part que j'ai zapper les * effectivement merci
 
et en quoi elle est douteuse ?????
 
PS :  
 
Oui je comparé des adresses et je faisais pas de tests

Code :
  1. // Définition du foncteur servant à trier nos objets selon leur critere  
  2. struct MySort
  3. {
  4. bool operator ()(Geom * a1, Geom * a2) const
  5. {
  6.     if (a1 != NULL && a2 != NULL) 
  7.         return *a1 < *a2;
  8.     else return false;
  9. }
  10. };


 
C'est good là, ça marche.


Message édité par Chronoklazm le 22-10-2005 à 01:19:38

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 22-10-2005 à 01:27:00    

const Geom * dans la signature
 
sinon ta logique de tri polymorphe. J'aurais tendance à éviter de comparer des objets qui ne sont pas du même type. Où alors pas operator< virtuel ou dépendant du type réel. Sinon tu risques d'avoir un operateur pas symétrique.

Reply

Marsh Posté le 22-10-2005 à 01:42:48    

Point *p = dynamic_cast<Point *>(&g);
 
t'es pas obligé de passer en pointeur tu sais ...

Reply

Marsh Posté le 22-10-2005 à 13:23:27    

Oui mais c'est le seul type de cast que je connais qui donne une information si le cast a échoué, et puis de toute façon il cast que si c'est du Point * donc c'est carrement plus secure que le static_cast.  
 
Sinon pour ce qui est de la comparaison de 2 objets differents je balance une exception. Genre je peux pas comparer un Point avec un Rectangle par exemple mais je peux comparer un Point avec un Point_l ou Point_c (lumineux ou coloré).


Message édité par Chronoklazm le 22-10-2005 à 13:24:15

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 22-10-2005 à 14:46:22    

je te parle pas de ça boolay :)
 
si t'as des référence, fais un dynamic_cast<Truc&> qui balance une bad_cast si ça échoue.
 
 
Dans le cas de ton tri, je vois toujours pas la sémantique de trier une collection d'objets hétérogènes ...

Reply

Sujets relatifs:

Leave a Replay

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