2011-11-02 2 views
4

Possible en double:
Advantages of std::for_each over for loopPourquoi utiliser std :: for_each sur une boucle for?

Je jouais avec des 11 fonctionnalités C++ et je suis curieux de savoir pourquoi std :: for_each est bénéfique. Ne serait-il pas plus facile et plus propre de faire une boucle for ou est-ce parce que je suis tellement habitué à le faire de cette façon?

#include <iostream> 
#include <tuple> 
#include <vector> 
#include <algorithm> 

typedef std::tuple<int, int> pow_tuple; 

pow_tuple pow(int x) 
{ 
    return std::make_tuple(x, x*x); 
} 

void print_values(pow_tuple values) 
{ 
    std::cout << std::get<0>(values) << "\t" << std::get<1>(values) << std::endl; 
} 

int main(int argc, char** argv) 
{ 
    std::vector<int> numbers; 
    for (int i=1; i < 10; i++) 
     numbers.push_back(i); 
    std::for_each(numbers.begin(), numbers.end(), 
     [](int x) { print_values(pow(x)); } 
     ); 

    std::cout << "Using auto keyword:" << std::endl; 
    auto values = pow(20); 
    print_values(values); 
    return 0; 
} 
+0

Le principal point de boucles foreach est de regarder plus soigné et plus facile pour un être humain à interpréter que leurs homologues pour (;;). Personnellement, j'ai un biais vers les boucles régulières pour – Akron

+0

en regardant dans les fonctionnalités C++ 11 J'utiliserais le mot-clé auto déjà dans la boucle et commencer (numéros)/fin (numéros). le rend plus compatible avec différents types de données. – inf

Répondre

3

Cela dépend quelque peu des conventions de codage locales, mais il y a deux avantages potentiels . Le premier est qu'il indique clairement que le code itére sur tous les éléments de la séquence; à moins que les conventions de codage locales disent le contraire (et elles sont appliquées), vous devez considérer que certains programmeurs cowboy ont peut-être inséré un break. Le deuxième est qu'il nomme l'opération que vous effectuez sur chaque élément ; cette fois peut facilement être manipulé en appelant une fonction dans la boucle , et bien sûr, les opérations vraiment triviales peuvent ne pas avoir besoin d'un nom.

Il y a aussi l'avantage, au moins si vous n'utilisez pas encore C++ 11, que vous n'avez pas besoin d'épeler les types d'itérateur; l'itérateur types créent beaucoup de verbiage, dans lequel la logique importante peut obtenir perdu ou négligé.

7

les algorithmes standards gèrent correctement tous les problèmes de mise en boucle, ce qui réduit le risque de faire des erreurs ponctuelles et autres, permettant de vous concentrer sur le calcul et non la mise en boucle.

+1

+1 pour cela. Le code écrit pour fonctionner avec les algorithmes STL permet de tester le corps de la boucle de manière isolée, ce qui réduit le nombre total de tests requis (http://stackoverflow.com/questions/588700/programmer-productivity-with-stl-vs-custom-utility -classes/590124 # 590124). –

1

On pourrait dire que cette forme vous permet d'écrire ce morceau de code sans l'index inutile à manipuler et faire des erreurs avec.

C'est aussi un idiome qui existe dans d'autres langues, et puisque vous obtenez des fonctions anonymes, cette fonctionnalité peut être un bon exemple de fonctions de niveau supérieur (but éducatif?).

Je suis d'accord qu'il ne se sent pas comme C++ ...

Questions connexes