Comme la fonction acceptée par for_each prendre un seul paramètre (l'élément du vecteur), je dois définir un static int sum = 0
quelque part de sorte qu'il est possible d'accéder après avoir appelé le for_each . Je pense que c'est gênant. Une meilleure façon de faire cela (toujours utiliser for_each)?somme des carrés de chaque élément dans le vecteur en utilisant for_each
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
static int sum = 0;
void add_f(int i)
{
sum += i * i;
}
void test_using_for_each()
{
int arr[] = {1,2,3,4};
vector<int> a (arr ,arr + sizeof(arr)/sizeof(arr[0]));
for_each(a.begin(),a.end(), add_f);
cout << "sum of the square of the element is " << sum << endl;
}
Dans Ruby, nous pouvons le faire de cette façon:
sum = 0
[1,2,3,4].each { |i| sum += i*i} #local variable can be used in the callback function
puts sum #=> 30
Voulez-vous s'il vous plaît montrer plus d'exemples comment for_each
est généralement utilisé dans la programmation pratique (non seulement imprimer chaque élément)? Est-il possible d'utiliser for_each
simuler 'schéma de programmation' comme carte et injecter dans Ruby (ou carte/plier dans Haskell).
#map in ruby
>> [1,2,3,4].map {|i| i*i}
=> [1, 4, 9, 16]
#inject in ruby
[1, 4, 9, 16].inject(0) {|aac ,i| aac +=i} #=> 30
EDIT: Merci à tous. J'ai tellement appris de vos réponses. Nous avons tellement de façons de faire la même chose en C++, ce qui le rend un peu difficile à apprendre. Mais il est intéressant :)
Je ne pense pas que les itérateurs vectoriels soient dans l'espace de noms std. Si c'est correct, ADL n'est pas garanti pour fonctionner ici, et l'interrogateur n'a pas spécifié de compilateur. –
Vous avez raison. Je viens de vérifier - standard ne garantit pas que itérateur fait partie de l'espace de noms std. Seuls les itérateurs inverses font partie de l'espace de noms 'std'. –
onebyone: Wow, bonne prise. J'ai vérifié la norme et vous avez absolument raison. Ainsi, par exemple Si le vecteur :: iterator était typedefed à T *, ADL échouerait en effet. -1ing pour obtenir l'attention de l'OP ... (Le poste est par ailleurs excellent BTW.) –