Tri d'objet pointé dans un tableau

Tri d'objet pointé dans un tableau - C++ - Programmation

Marsh Posté le 24-08-2010 à 13:13:14    

Bonjour,
 
Dans le cadre de mon travail de programmation, je souhaiterais réaliser le tri des éléments d'un tableau contenant des adresses d'éléments de grande taille (afin d'alléger le travail et d'accélérer le code, je préfère conserver les adresses des éléments et non les éléments eux-mêmes).
 
Au final, le code bute sur l'écriture de l'opérateur de comparaison entre éléments :
 

Code :
  1. bool operator<(MaClasse* a,MaClasse* b)
  2. {
  3. //
  4. // Ma méthode de comparaison
  5. //
  6. }


 
Ainsi, le compilateur renvoie le message pour ces lignes :
 

Code :
  1. error C2803: 'operator <' doit avoir au moins un paramètre de type classe


 
L'algorithme de tri a été défini séparément et fonctionne tout à fait correctement sur des éléments non pointés (ie opérateur bool operator<(MaClasse a,MaClasse b) plutot que bool operator<(MaClasse* a,MaClasse* b)).
 
Est-ce que certains d'entre-vous sauraient d'où vient le problème et comment le corriger ?
Est-ce qu'il est possible, en C++, d'introduire des opérateurs de comparaison pour des opérations de tri, qui portent sur des pointeurs d'éléments et non les éléments eux-mêmes ?
 
En vous remerciant d'avance de votre aide
 
 

Reply

Marsh Posté le 24-08-2010 à 13:13:14   

Reply

Marsh Posté le 24-08-2010 à 13:35:08    

Les operateurs doivent avoir au moins un argument qui est d'un type defini par l'utilisateur (classe ou enum, les pointeurs n'en sont pas).
 
Les fonctions de tris de la bibliotheque standard prennent un foncteur en argument, donc tu peux passer ce que tu veux (fonction libre ou bien instance d'une classe ayant operator() comme membre).  Si tu ecris la fonction de tri toi-meme, je te suggere de faire de meme.  La bibliotheque standard a std::less<> qui permet de transformer l'operateur< en foncteur.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 27-08-2010 à 14:46:27    

Il faut que tu utilises le 3ème argument de std::sort.
 
Exemple complet:

Code :
  1. #include <iostream>
  2. struct MaClasse
  3. {
  4.   int i;
  5. public:
  6.   MaClasse(int j) : i(j) {}
  7.   int value() const { return this->i; }
  8. };
  9. bool operator<(const MaClasse &a, const MaClasse &b)
  10. {
  11.   return a.value() < b.value();
  12. }
  13. std::ostream & operator<<(std::ostream &out, const MaClasse &a)
  14. {
  15.   return out << a.value();
  16. }
  17. #include <iostream>
  18. #include <iterator>
  19. #include <algorithm>
  20. #include <functional>
  21. #include <vector>
  22. template<typename T>
  23. struct PointerComparator
  24.   : public std::binary_function<bool, const T*, const T*>
  25. {
  26.   bool operator()(const T* a, const T* b)
  27.   {
  28.     return *a < *b;
  29.   }
  30. };
  31. int main()
  32. {
  33.   std::vector<MaClasse*> array;
  34.   int value;
  35.   while (std::cin >> value) {
  36.     array.push_back(new MaClasse(value));
  37.   }
  38.   for (size_t i = 0; i < array.size(); ++i) {
  39.     std::cout << *array[i] << ", ";
  40.   }
  41.   std::cout << "\n";
  42.   std::sort(array.begin(), array.end(), PointerComparator<MaClasse>());
  43.   for (size_t i = 0; i < array.size(); ++i) {
  44.     std::cout << *array[i] << ", ";
  45.   }
  46.   std::cout << "\n";
  47. }

Reply

Sujets relatifs:

Leave a Replay

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