Je vois des objets de fonction utilisées souvent avec des algorithmes stl. Les objets de la fonction ont-ils été venus à cause de ces algorithmes? Quand utilisez-vous un objet de fonction en C ++? Quels sont ses avantages? P>
7 Réponses :
Les objets de fonction ont été conçus pour permettre une forte couche d'abstraction sur STL et, à cet égard, ils sont formidables.
Cependant, je préfère utiliser boost :: lid code> et lier une fonction sur les algorithmes stl - généralement ( mais pas dans les cas où l'objet a un état fort> ) Cela semble une solution plus élégante. P>
std::vector<int> someList;
int total = 0;
std::for_each(someList.begin(), someList.end(), [&total](int x) {
total += x;
});
std::cout << total;
Les objets de fonction (foncteurs) sont généralement utilisés à la place des pointeurs de fonction. Les pointeurs de fonction ont le problème que le compilateur les transmet généralement comme des pointeurs bruts, ce qui permet au compilateur de souscrire le code plus tard. Et ils sont plus faciles à donner des paramètres. p>
@JasonLine: Ce n'est pas le seul avantage, mais dans de nombreux cas, c'est l'avantage principal.
Je ne peux pas dire pourquoi ils sont venus - éventuellement simplement parce qu'ils le pouvaient! p>
Quand utilisez-vous un ameublement? Considérez qu'un fonctionnement vient de déplacer le code que vous mettriez normalement une boucle dans l'opérateur () d'une classe, ils ne sont pas si différents de simplement appeler une fonction dans une boucle tandis que ... sauf en les utilisant Vous autorisez le compilateur à aligner le code et vous pouvez également passer un objet pré-construit à la place, que vous avez construit avec un État. Ce dernier point les rend très puissant. P>
Comparer l'algorithme de tri avec l'appel QSort CRTS. Ils font la même chose, ce ne le faisait que très différemment. P>
Comme dit JDV, functors sont utilisés au lieu des pointeurs de fonctions, qui sont plus difficiles à optimiser et en ligne pour le compilateur; En outre, un avantage fondamental de foncteurs est qu'ils peuvent facilement conserver un état entre les appels à leur 1 sup>, afin qu'ils puissent travailler différemment selon les autres fois ils ont été appelés, garder une trace en quelque sorte des paramètres qu'ils ont utilisé, ... Par exemple, si vous voulez résumer tous les éléments dans deux conteneurs de ints vous pouvez faire quelque chose comme ceci: p> struct
{
int sum;
void operator()(int element) { sum+=element; }
} functor;
functor.sum=0;
functor = std::for_each(your_first_container.begin(), your_first_container.end(), functor);
functor = std::for_each(your_second_container.begin(), your_second_container.end(), functor);
std::cout<<"The sum of all the elements is: "<<functor.sum<<std::endl;
Une déclaration légèrement plus précise est que les foncteurs peuvent prendre en charge plusieurs états indépendants (les fonctions peuvent prendre en charge un seul état via des statistiques / globaux qui ne sont ni thread-coffre-fort ni réentrant).
Vous voulez sûrement dire que les pointeurs de fonction sont plus difficiles à optimiser et en ligne? La façon dont il est écrit maintenant, c'est un peu flou.
Je voulais dire que les pointeurs de fonction sont plus difficiles à optimiser et en ligne; Il ne semble pas ne semble pas clair pour moi: "Cela" fait référence à la dernière phrase de la phrase précédente, c'est-à-dire "des pointeurs de fonction". Toutefois, si vous voulez suggérer un meilleur phrasé, je serai heureux de modifier. :)
N'oubliez pas que vous êtes normalement des foncteurs sont censés se comporter comme des fonctions pures. Voir Effectif STL Effectu à Scott Myers # 39: Faire des prédicats Fonctions pures Code>.
Il est lié juste au fait que de nombreux algorithmes (par exemple le tri des algorithmes) s'appuient sur le fait que la même fonction appelée avec les mêmes paramètres donne le même résultat ou y a-t-il autre chose derrière cela?
Je ne pense pas que le code il fonctionne comme prévu, parce que std :: for_each code> (et toute autre fonction STL Je me souviens) prend la foncteur en valeur, non par référence.
for_each code> retourne le foncteur mis à jour de sorte que vous voulez faire quelque chose comme
foncteur = std :: for_each (... code>
En outre, @billyonéal, les conseils de Myers Scott ne concernent que des prédicats tels que ce que vous passez à std :: Trier code>, pas les foncteurs en général.
@Sumudufernando: vrai; D'autre part, des interfaces conçoivent des interfaces avec des interfaces telles que std :: Trier code> à l'esprit. Bien sûr, s'il y a des indications au contraire par tous les moyens, allez-y et faites ce que vous voulez.
Un objet de fonction est une fonction qui est également un objet, c'est-à-dire qu'il a l'état. Les fonctions normales n'ont généralement pas d'état. Ils peuvent imiter l'État en accédant à des variables globales, mais l'État est partagé dans toutes les invocations. P>
L'idée d'encapsuler une fonction comme objet remonte à Lisp et à SmallTalk. L'idée C ++ de Foncteur était un chapitre du livre de Jim Coplien Styles de programmation et idiomes de programmation avancés C ++ en 1991. STL a utilisé l'idiome et le vulgarisé en outre. P>
Cet article a un Excellente approfondie des objets de fonction et comment il peut rendre le code beaucoup plus puissant, et plus propre. P>
Voir aussi: Stackoverflow.com/questions/356950/c- fonceurs-et-leurs-utilisations