/** * * @file FunctorFind.cpp * * @authors M. Laporte, D. Mathieu * * @date 07/12/2011 * * @version V1.0 * **/ #include <string> #include <vector> #include <algorithm> // sort() #include <iostream> using namespace std; namespace { template <typename T> class IPredicatGen { public : virtual ~IPredicatGen (void) {} virtual bool operator () (const T &) const = 0; }; // IPredicatGen template <typename T, typename TRes> class IUnaryFunction { public : virtual ~IUnaryFunction (void) {} virtual TRes operator () (const T &) const = 0; }; // IUnaryFunction class Pers { string myNom; unsigned myAge; public : Pers (const string & Nom, unsigned Age) : myNom (Nom), myAge (Age) {} const string & getNom (void) const noexcept { return myNom; } unsigned getAge (void) const noexcept { return myAge; } private : ostream & display (ostream & os) const { return os << getAge () << " - " << getNom (); } // display() public : friend ostream & operator << (ostream & os, const Pers & p) { return p.display (os); } }; // Pers class SelParTrancheAge : public IPredicatGen <Pers> // class SelParTrancheAge : public IUnaryFunction <Pers, bool> { unsigned myAgeMin; unsigned myAgeMax; public : SelParTrancheAge (unsigned ageMin, unsigned ageMax) : myAgeMin (ageMin), myAgeMax (ageMax) {} virtual ~SelParTrancheAge (void) noexcept {} virtual bool operator () (const Pers & p) const { return myAgeMin <= p.getAge () && p.getAge () <= myAgeMax; } // operator () }; // SelParTrancheAge class SelParNomMin : public IPredicatGen <Pers> // class SelParNomMin : public IUnaryFunction <Pers, bool> { string myNomMin; public : SelParNomMin (const string & nomMin) : myNomMin (nomMin) {} virtual ~SelParNomMin (void) noexcept {} virtual bool operator () (const Pers & p) const { return myNomMin < p.getNom (); } // operator () }; // SelParNomMin void functorFind (void) { cout << "FunctorFind : \n"; typedef vector <Pers> CVPers; CVPers vPers; vPers.push_back ( Pers ("Charlotte", 21)); vPers.push_back ( Pers ("Alfred", 12)); vPers.push_back ( Pers ("Jean", 42)); vPers.push_back ( Pers ("Noemie", 11)); vPers.push_back ( Pers ("Berthe", 99)); vPers.push_back ( Pers ("Agathe", 29)); vPers.push_back ( Pers ("Sylvain", 42)); vPers.push_back ( Pers ("Pierre", 75)); for (const Pers & personne : vPers) cout << personne << '\n'; CVPers::const_iterator pos; cout << "\nRecherche sur 43 <= age <= 75 : "; pos = find_if (vPers.begin (), vPers.end (), SelParTrancheAge (43, 75));// a completer if (vPers.end () == pos) cout << "Aucun element ne correspond a ce critere\n"; else cout << *pos << '\n'; cout << "\nRecherche sur 43 <= age <= 45 : "; pos = find_if (vPers.begin (), vPers.end (), SelParTrancheAge (43, 45)); // a completer if (vPers.end () == pos) cout << "Aucun element ne correspond a ce critere\n"; else cout << *pos << '\n'; cout << '\n'; cout << "\nRecherche sur nom > Noemie : "; pos = find_if (vPers.begin (), vPers.end (), SelParNomMin ("Noemie"));// a completer if (vPers.end () == pos) cout << "Aucun element ne correspond a ce critere\n"; else cout << *pos << '\n'; cout << "\nRecherche sur nom > alfred : "; pos = find_if (vPers.begin (), vPers.end (), SelParNomMin ("alfred"));// a completer if (vPers.end () == pos) cout << "Aucun element ne correspond a ce critere\n"; else cout << *pos << '\n'; } // functorFind() } // namespace int main (void) { functorFind (); return 0; } // main()