for_eachが受け入れる関数は1つのパラメータ(ベクトルの要素)のみをとるため、 を呼び出すとをどこかに定義する必要があります。 。私はこれが厄介だと思う。これを行うには良い方法です(まだfor_eachを使用しています)? Rubyで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;
}
、我々はそれをこのように行うことができます。
sum = 0
[1,2,3,4].each { |i| sum += i*i} #local variable can be used in the callback function
puts sum #=> 30
をあなたはfor_each
は、一般的に(ちょうど各要素をプリントアウトしていない)の実用的なプログラミングで使用される方法の詳細例を示していただけますか?可能ですかfor_each
は、マップのような「プログラミングパターン」をシミュレートし、Ruby(またはHaskellのmap/fold)で注入できますか?
#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
編集:ありがとうございます。私はあなたの回答からとても多くを学んだ。同じことをC++で行う方法はたくさんありますが、それは少し難しいものです。しかし、それは面白いです:)
ベクトルイテレータはstd名前空間にあるとは限りません。それが正しい場合、ADLはここで動作することが保証されておらず、質問者はコンパイラを指定していません。 –
あなたはそうです。私はちょうどチェックした - 標準は、イテレータがstd名前空間の一部であることを保証しません。逆イテレータだけが 'std'名前空間の一部です。 –
ワンワン:うわー、いいキャッチ。私は標準をチェックし、あなたは絶対に正しいです。だからベクトル :: iteratorがT *にtypedefedされた場合、ADLは実際には失敗します。 OPの注目を集めようとしています...(投稿はそれ以外の点では優れています) –