Advertisement
cesarcardinale

TP8 Exo 3 - Aix

May 24th, 2018
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>            // sort()
  4. #include <vector>
  5. #include <functional>
  6.  
  7. using namespace std;
  8.  
  9. namespace
  10. {
  11.     template <typename T1, typename T2, typename TRes>
  12.     class IBinaryFunction
  13.     {
  14.       public :
  15.         typedef T1   first_argument_type;
  16.         typedef T2   second_argument_type;
  17.         typedef TRes result_type;
  18.         virtual ~IBinaryFunction (void) {}
  19.         virtual TRes operator () (const T1 &, const T2 &) const = 0;
  20.     }; // IBinaryFunction
  21.  
  22.     class Pers
  23.     {
  24.         string   myNom;
  25.         unsigned myAge;
  26.  
  27.       public :
  28.         Pers (const string & Nom, unsigned Age): myNom (Nom), myAge (Age) {}
  29.  
  30.         const string & getNom (void) const noexcept { return myNom; }
  31.         unsigned       getAge (void) const noexcept { return myAge; }
  32.  
  33.     private :
  34.         ostream & display (ostream & os)  const
  35.         {
  36.             return os << getAge () << " - " << getNom ();
  37.  
  38.         } // display()
  39.  
  40.       public :
  41.         friend ostream & operator << (ostream & os, const Pers & p)
  42.         {
  43.             return p.display (os);
  44.  
  45.         }
  46.  
  47.     }; // Pers
  48.  
  49.     class TriParAgeAsc : public IBinaryFunction <Pers,Pers,bool>
  50.     {
  51.       public :
  52.         virtual ~TriParAgeAsc (void) noexcept {}
  53.  
  54.         virtual bool operator () (const Pers & p1, const Pers & p2)
  55.                         const noexcept
  56.         {
  57.             return p1.getAge () <= p2.getAge ();
  58.  
  59.         } // operator ()
  60.  
  61.     }; // TriParAgeAsc
  62.  
  63.     class TriParNomDesc : public IBinaryFunction <Pers,Pers,bool>
  64.     {
  65.       public :
  66.         virtual ~TriParNomDesc (void) noexcept {}
  67.  
  68.         virtual bool operator () (const Pers & p1, const Pers & p2)
  69.                         const noexcept
  70.         {
  71.             return p1.getNom () >= p2.getNom ();
  72.  
  73.         } // operator ()
  74.  
  75.     }; // TriParNomDesc
  76.  
  77.     void functorSort (void)
  78.     {
  79.         cout << "FunctorSort : \n";
  80.  
  81.         typedef vector <Pers> CVPers;
  82.  
  83.         CVPers vPers;
  84.  
  85.         vPers.push_back ( Pers ("Charlotte", 21));
  86.         vPers.push_back ( Pers ("Alfred",    12));
  87.         vPers.push_back ( Pers ("Jean",      42));
  88.         vPers.push_back ( Pers ("Noemie",    11));
  89.         vPers.push_back ( Pers ("Berthe",    99));
  90.         vPers.push_back ( Pers ("Agathe",    29));
  91.         vPers.push_back ( Pers ("Sylvain",   42));
  92.         vPers.push_back ( Pers ("Pierre",    75));
  93.  
  94.         cout << "\nTri par age croissant\n\n";
  95.  
  96.         sort (vPers.begin (), vPers.end (), TriParAgeAsc ());
  97.  
  98.         for (const Pers & personne : vPers)
  99.             cout << personne << '\n';
  100.  
  101.         cout << "\nTri par nom decroissant\n\n";
  102.  
  103.         sort (vPers.begin (), vPers.end (), TriParNomDesc ());
  104.  
  105.         for (const Pers & personne : vPers)
  106.             cout << personne << '\n';
  107.  
  108.         cout << "\nRecherche de la premiere personne d'age <= 40 : ";
  109.  
  110.         CVPers::const_iterator pos = find_if (vPers.begin (), vPers.end (), bind2nd(TriParAgeAsc(),Pers("",40)));
  111.  
  112.         if (vPers.end () == pos)
  113.             cout << "Aucun element correspondant\n";
  114.         else
  115.             cout << *pos << '\n';
  116.  
  117.         cout << "\nRecherche de la premiere personne d'age <= 4 : ";
  118.         pos = find_if (vPers.begin (), vPers.end (), bind2nd(TriParAgeAsc(),Pers("",4)));
  119.  
  120.         if (vPers.end () == pos)
  121.             cout << "Aucun element correspondant\n";
  122.         else
  123.             cout << *pos << '\n';
  124.  
  125.     } // functorSort()
  126.  
  127. } // namespace
  128.  
  129. int main (void)
  130. {
  131.     functorSort ();
  132.  
  133.     return 0;
  134.  
  135. } // main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement