2015-07-11 38 views
0

我是functor的新手。任何人都可以向我解釋,在下面的代碼中,程序何時爲Vector的每個元素創建AddValue類的對象?對我來說,for_each()函數應該做的是先從vec中獲取一個元素,然後使用該值創建一個新的AddVal obj(obj.i = value),然後調用函數AddVal(20)將20添加到i中並打印出來。但是我沒有看到創建新對象的過程在哪裏發生。謝謝你。C++ stl for_each()和functor,它在哪裏創建新對象

#include<iostream> 
#include<vector> 
#include<algorithm> 
class AddVal{ 
     public: 
     int i; 
     AddVal(int x) : i(x) {} 
     void operator() (int val) {std::cout << val+i << std::endl;} 
}; 

int main() 
{ 
     std::vector<int> vec = {1,2,3,4,5}; 
     for_each(vec.begin(),vec.end(),AddVal(20)); 
} 
+0

這聽起來像功課:(從何而來的代碼,你做了什麼你自己去了解它 –

回答

1

AddVal(20)創建一個作爲第三個參數傳入的單個AddVal對象for_eachfor_each然後在矢量的每個元素上評估這個對象。該代碼是有點相當於:?

std::vector<int> vec = {1,2,3,4,5}; 
AddVal add_val(20); // create the AddVal object 
for (const int& i : vec) { 
    add_val(i); // calls AddVal::operator() 
} 
+0

我不太明白爲什麼AddVal(20)在for_each循環之前首先創建一個AddVal對象?因爲構造函數需要一個參數來初始化對象的成員值i,你是不是意味着它首先創建一個對象而不初始化它?在參數 – daydayup

+0

@daydayup:你認爲20是什麼,如果不是構造函數的參數? –

+0

@BenjaminLindley。哦,我突然意識到這一點,我認爲它必須首先考慮向量的元素,然後添加20到它;現在它將向量添加到20;這是相同的。 – daydayup

4
for_each(vec.begin(),vec.end(),AddVal(20)); 
//        ^
//       right here 

AddVal(20)創建臨時AddVal對象,調用構造AddVal(int x),並通過20作爲參數傳遞給該構造函數。然後,for_each算法使用該對象(或其副本)的operator()vec的每個元素。