*Les foncteurs sont des objets de classes qui surchargent l’opérateur () Ce sont donc des objets-fonctions, ou fonctions généralisées On peut les passer en argument à une méthode ou à une autre fonction
class Addition{
public: int operator()(int a, int b) //surcharge de l'opérateur ()
{
return a+b;
}
};
int main() {
Addition foncteur; //crée un objet de type foncteur int a = 2, b=3;
cout << foncteur(a,b) << endl; //affiche 5
return 0;
}class Translate{
double translation;
public:
Translate ( const double translation ):m_translation ( translation ) {}
const double operator ()(const double x)
{
return x+ m_translation;
}
};
int main(){
Translate foncteurTranslation (5.) ; // foncteur qui translate de 5
double x =4.3;
cout << foncteurTranslation (x) << endl ; // affiche 9.3
}- Les algorithmes sont des fonctions qui permettent de faire des modifications sur les conteneurs (supprimer les doublons, chercher un élément, trier un tableau,…)
- La STL en contient un grand nombre : http://www.cplusplus.com/reference/algorithm/
- Les algorithmes de la STL sont optimisés, il ne sert à rien de vouloir les réécrire
vector <int > tab (30) ; // vecteur de 30 entiers
fill (tab.begin () , tab.end () , 3); // remplit le tableau avec des 3
//foncteur GenererNb qui renvoie un entier aléatoire à coder
generate (tab.begin() , tab. begin()+10 , GenererNb()); //appelle le foncteur GenererNb pour les 10 premiers éléments de tab et stocke le résultat dans l’élémentvector <int > tab (30) ; // vecteur de 30 entiers
vector <int > tabResult (30) ;
Translate unFoncteur(2.) ; //foncteur qui translate de 2
transform ( tab.begin() , tab.end() , tabResult.begin() , unFoncteur ); /* applique unFoncteur a chaque élément de tab et stocke chaque élément transformé dans tabResult */
struct AfficheInt{
void operator()(const int n) { cout << n << endl ; }
};
AfficheInt unAutreFoncteur ;
for_each (tab.begin() , tab.end() , unAutreFoncteur ); /* applique unAutreFoncteur a chaque élément de tab, donc affiche les éléments à la console*/
int minimum = * min_element ( tab.begin(), tab.end()); //récupère le min
int maximum = * max_element ( tab.begin() , tab.end()); //récupère le max
vector<int>::iterator it = find(tab.begin(), tab.end(), 100) ; //recherche 100
sort (tab.begin(), tab.end ()); //tri tab