Advertisement
Guest User

Exo 1 P00

a guest
May 24th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.42 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5. namespace {
  6.  
  7. class Pers /* : public IEditable */
  8. {
  9. string myNom;
  10. unsigned myAge;
  11.  
  12. public :
  13. Pers (const string & nom, unsigned age)
  14. : myNom (nom), myAge (age) {}
  15.  
  16. const string & getNom (void) const noexcept { return myNom; }
  17. unsigned getAge (void) const noexcept { return myAge; }
  18.  
  19. private :
  20. ostream & display (ostream & os) const
  21. {
  22. return os << getAge () << " - " << getNom ();
  23.  
  24. } // display()
  25.  
  26. public : // ajouté pour faciliter les essais
  27.  
  28. friend ostream & operator << (ostream & os, const Pers & p)
  29. {
  30. return p.display (os);
  31. }
  32.  
  33. }; // Pers
  34.  
  35. template <typename T>
  36. class ILessThanGen
  37. {
  38. public :
  39. virtual ~ILessThanGen (void) {}
  40. virtual bool operator () (const T &, const T &) const = 0;
  41. }; // ILessThanGen
  42.  
  43. class TriParAgeAsc : public ILessThanGen <Pers>
  44. {
  45. public:
  46. virtual ~TriParAgeAsc() {}
  47. virtual bool operator() (const Pers & p1, const Pers & p2) const {return p1.getAge() < p2.getAge();}
  48.  
  49. };//TriParAgeAdc
  50.  
  51. class TriParNomDesc : public ILessThanGen <Pers>
  52. {
  53. public:
  54. virtual ~TriParNomDesc() {}
  55. virtual bool operator() (const Pers & p1, const Pers & p2) const {return p1.getNom() > p2.getNom();}
  56.  
  57. };//TriParNomDesc
  58.  
  59.  
  60.  
  61. }
  62.  
  63.  
  64.  
  65. template <typename iter_t, typename T>
  66. iter_t partitionnement (const iter_t & first, const iter_t & last, const ILessThanGen <T> & comparateur)
  67. {
  68. bool isUp = true;
  69. iter_t pivot;
  70. iter_t courant;
  71. int incr;
  72. pivot = first;
  73. courant = last;
  74. incr = -1;
  75. while (pivot != courant) {
  76. if(((!isUp) && comparateur(*pivot, *courant)) || (isUp && comparateur(*courant, *pivot)))
  77. {
  78. swap(*pivot, *courant);
  79. swap(pivot, courant);
  80. isUp = !(isUp);
  81. incr = -incr;
  82. }
  83. courant = courant + incr;
  84. }
  85. return pivot;
  86. }
  87.  
  88. template <typename iter_t, typename T>
  89. void quickSort (const iter_t & beg, const iter_t & end, const ILessThanGen <T> & comparateur)
  90. {
  91. if (beg < end)
  92. {
  93. iter_t pos;
  94. pos = partitionnement (beg, end - 1, comparateur);
  95. quickSort(beg, pos, comparateur);
  96. quickSort(pos + 1, end, comparateur);
  97. }
  98. }
  99.  
  100.  
  101.  
  102. void functorSort (void)
  103. {
  104. cout << "FunctorSort : \n";
  105.  
  106. typedef vector <Pers> CVPers;
  107.  
  108. CVPers vPers;
  109.  
  110. vPers.push_back ( Pers ("Charlotte", 21));
  111. vPers.push_back ( Pers ("Alfred", 12));
  112. vPers.push_back ( Pers ("Jean", 42));
  113. vPers.push_back ( Pers ("Noemie", 11));
  114. vPers.push_back ( Pers ("Berthe", 99));
  115. vPers.push_back ( Pers ("Agathe", 29));
  116. vPers.push_back ( Pers ("Sylvain", 42));
  117. vPers.push_back ( Pers ("Pierre", 75));
  118.  
  119. cout << "\nTri par age croissant\n\n";
  120.  
  121. quickSort (vPers.begin (), vPers.end (), TriParAgeAsc ());
  122.  
  123. for (const Pers & personne : vPers)
  124. cout << personne << '\n';
  125.  
  126. cout << "\nTri par nom decroissant\n\n";
  127.  
  128. quickSort (vPers.begin (), vPers.end (), TriParNomDesc ());
  129.  
  130. for (const Pers & personne : vPers)
  131. cout << personne << '\n';
  132.  
  133. } // functorSort()
  134.  
  135.  
  136.  
  137.  
  138. int main()
  139. {
  140. cout << "Hello World!" << endl;
  141. functorSort();
  142. return 0;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement