2016-02-28 52 views
1

我有一個整數的矢量充滿了5個號碼,我很好奇究竟是什麼[&idx]做:的for_each函數C++ 11

int idx = 0; 
for_each (x . begin(), x . end(), [&idx] (const int & a) { cout << idx ++ << " " << a << endl; });` 

爲什麼它不喜歡這個工作? :

int idx = 0; 
    for_each (x . begin(), x . end(), (const int & a, int & idx) { cout << idx ++ << " " << a << endl; }); 

從性能的角度來看比它更好嗎? :

for (vector<int>::size_type i = 0; i < x . size(); i ++) 
    cout << x[i] << endl; 
+2

此外,你的第二個代碼塊有錯誤的語法。即使沒有捕獲列表,Lambdas仍然需要'[]'。 –

回答

3

我很好奇,究竟是什麼[&idx]

這就是拉姆達捕獲。它將lambda設置爲參考idx。它不會用作參數,因爲for_each僅將一個參數傳遞給謂詞。如果您製作idx參數,它將不會編譯。

從性能的角度來看,它也更好嗎?

可能。如果你真的想知道,測試每種做法。

3

究竟是什麼[& IDX]在

[](){} 

結構做,作爲C++ 11,是λ函數 - 也就是,一個匿名函數,其,在這種情況下,將作爲參數傳遞的向量元素進行回調。 [&idx]表示變量idx不是通常情況下屬於拉姆達的環境,而是後者通常不可訪問的,應該通過引用來訪問(捕獲)它。這意味着您可以在lambda體內使用idx,並且每當您這樣做時,您都使用對原始變量的引用。因此,idx++部分代碼將增加原始idx變量而不是某些本地副本。

爲什麼它不能這樣工作?

因爲() {}結構不是有效的C++表達式或語句。

從perfomance的角度來看比它更好嗎? :

可能但不一定,您應該測量以確定。但是,使用迭代器和算法而不是C風格的循環是明智和習慣的。鑑於標準的「避免過早優化」指南,我建議您默認使用第一個版本,當您完成所有開發時,您可以決定是否要花一些時間嘗試和測量替代方案,如第二版。如果這不在你的程序的某個關鍵部分(例如在某個回調函數中),我認爲它不值得大驚小怪,反正差別非常小。

僅供參考,在我的系統中,採用clang++-O3標誌,你std::foreach版本的1000次迭代將持續4967ms而for一個3861ms的1000。對於1000次迭代,這大約爲1秒,例如1ms如果你只運行一次這個代碼..