Voici quelques raisons :
-
Cela semble entraver la lisibilité simplement parce que vous n'y êtes pas habitué et/ou parce que vous n'utilisez pas les bons outils qui l'entourent pour le rendre vraiment facile (voir boost::range et boost::bind/boost::lambda pour les aides). Beaucoup d'entre eux iront dans C++0x et rendront for_each et les fonctions connexes plus utiles).
-
Il vous permet d'écrire un algorithme au-dessus de for_each qui fonctionne avec n'importe quel itérateur.
-
Cela réduit les risques de fautes de frappe.
-
Il ouvre également votre esprit au reste des algorithmes STL, tels que find_if
, sort
, replace
etc. et ils n'auront plus l'air aussi étranges. Cela peut être une grande victoire.
Mise à jour 1 :
Plus important encore, il vous aide à aller au-delà for_each
contre les boucles for comme s'il n'y avait que ça, et regardez les autres analogues STL, comme find / sort / partition / copy_replace_if, exécution parallèle ou autre.
Beaucoup de traitements peuvent être écrits de manière très concise en utilisant "le reste" des frères et soeurs de for_each, mais si tout ce que vous faites est d'écrire une boucle for avec diverses logiques internes, alors vous n'apprendrez jamais à les utiliser, et vous finirez par inventer la roue encore et encore.
Et (le style for_each qui sera bientôt disponible) + lambdas :
for_each(monsters, [](auto& m) { m.think(); });
est, selon l'OMI, plus lisible que :
for (auto i = monsters.begin(); i != monsters.end(); ++i) {
i->think();
}
Aussi ceci :
for_each(bananas, [&](auto& b) { my_monkey.eat(b); );
est plus concis que :
for (auto i = bananas.begin(); i != bananas.end(); ++i) {
my_monkey->eat(*i);
}
Mais la nouvelle gamme basée pour est probablement la meilleure :
for (auto& b : bananas)
my_monkey.eat(b);
Mais le for_each pourrait être utile, surtout si vous avez plusieurs fonctions à appeler dans l'ordre mais que vous devez exécuter chaque méthode pour tous les objets avant la suivante... mais peut-être que ce n'est que moi. ;)
Mise à jour 2 : J'ai écrit mes propres wrappers one-liner de stl-algos qui fonctionnent avec des plages au lieu de paires d'itérateurs. boost::range_ex, une fois publié, inclura cela et peut-être sera-t-il là dans C++0x aussi ?
11 votes
std::for_each
lorsqu'il est utilisé avecboost.lambda
oboost.bind
peut souvent améliorer la lisibilité0 votes
La question et la réponse acceptée datent de 2010. Pour une réponse plus à jour (de 2018), voir ici : fluentcpp.com/2018/03/30/est-stdfor_each-obsolete