Utilisez toujours la variante qui décrit le mieux ce que vous avez l'intention de faire. C'est
Pour chaque élément x
de vec
, faire bar.process(x)
.
Examinons maintenant les exemples:
std::for_each(vec.begin(), vec.end(),
std::bind1st(std::mem_fun_ref(&Bar::process), bar));
Nous en avons for_each
aussi un - yippeh . Nous avons la [begin; end)
gamme sur laquelle nous voulons opérer.
En principe, l'algorithme était beaucoup plus explicite et donc préférable à toute implémentation manuscrite. Mais alors ... des reliures? Memfun? Fondamentalement, C ++ interna de la façon d'obtenir une fonction membre? Pour ma tâche, je m'en fous ! Je ne veux pas non plus souffrir de cette syntaxe bavarde et effrayante.
Maintenant, l'autre possibilité:
for (std::vector<Foo>::const_iterator it = vec.begin(); it != vec.end(); ++it)
{
bar.process(*it);
}
Certes, c'est un modèle courant à reconnaître, mais ... création d'itérateurs, bouclage, incrémentation, déréférencement. Ce sont aussi des choses dont je ne me soucie pas pour accomplir ma tâche.
Certes, il semble waay mieux que la première solution (au moins, la boucle corps est flexible et tout à fait explicite), mais encore, ce n'est pas vraiment que grand. Nous utiliserons celui-ci si nous n'avions pas de meilleure possibilité, mais peut-être que nous avons ...
Une meilleure façon?
Revenons maintenant à for_each
. Ne serait-il pas formidable de dire littéralement for_each
et d' être flexible dans l'opération qui doit être faite aussi? Heureusement, depuis les lambdas C ++ 0x, nous sommes
for_each(v.begin(), v.end(), [&](const Foo& x) { bar.process(x); })
Maintenant que nous avons trouvé une solution abstraite et générique à de nombreuses situations connexes, il convient de noter que dans ce cas particulier, il existe un favori absolu # 1 :
foreach(const Foo& x, vec) bar.process(x);
Cela ne peut vraiment pas être beaucoup plus clair que cela. Heureusement, C ++ 0x get est une syntaxe similaire intégrée !
map(bar.process, vec)
bien que la carte des effets secondaires soit déconseillée et que les compréhensions de liste / expressions de générateur soient recommandées par rapport à la carte).