2015-08-21 42 views
4

请看下面的例子:C++函数对象的意外行为的for_each

#include <iostream> 
#include <vector> 
#include <algorithm> 
using namespace std; 

class accum 
{ 
public: 
    int sum; 
    accum() 
    { 
     sum = 0; 
    } 
    void operator() (int a) 
    { 
     sum += a; 
     printf("sum=%d\n",sum); 
    } 
}; 

int main() 
{ 
    int ari[] = {2,8,5,9,1}; 
    vector<int> vi(&ari[0], &ari[5]); 
    accum f; 
    for_each(vi.begin(), vi.end(), f); 
    printf("final sum : %d\n", f.sum); 
} 

我预想的总和是25,但它打印0。为什么f保持不变?有人可以给我一个关于发生了什么的详细报告吗?

回答

5

这是因为std::for_each,而不是引用。它在f的副本内部运行,并且您通过的那个保持不变。它确实回报函子还给你,所以你可以只覆盖你:

accum f = std::for_each(vi.begin(), vi.end(), accum()); 

或者,用C++ 03贴,有accum采取参考:

struct accum { 
    int& sum; 
    // rest as before, fixing the constructor 
}; 

int sum = 0; 
std::for_each(vi.begin(), vi.end(), accum(sum)); 
printf("final sum : %d\n", sum); 

虽然也许你可能只是想std::accumulate

int sum = std::accumulate(vi.begin(), vi.end(), 0); 

或者,在C++ 11,for_each有拉姆达:

int sum = 0; 
std::for_each(vi.begin(), vi.end(), [&](int a){ sum += a; }); 
+0

谢谢。很有帮助。 – HyunSangTae