2015-08-21 64 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