2017-07-30 61 views
1

我試圖使用lambda的頻繁發生載體插入防止調用等效功能:插入到向量中時,使用返回的lambda而不是函數的返回值是否合理?

std::vector<vector<double>> A 

// There are several loops like this with different conditions 
for(auto i(0); i<100; ++i) 
    A.push_back(myFunction(
          lots, 
          of, 
          parameters, 
          including, 
          index, 
          and, 
          condition 
         )); 

與此相比,拉姆達顯得相當優雅:

auto myLambda = [&](size_t loopIndex, double condition) -> vector<double> { 
       //body identical to that of myFunction   
} 

for(auto i(0); i<100; ++i) 
    A.push_back(myLambda(i, 3.141)) 

for(auto i(0); i<100; ++i) 
    A.push_back(myLambda(i, 42)) 

回報和身體someFunction與lambda相同。

這種方法有什麼不足嗎? 與函數相比,lambda參數的數量減少表明在交付數據時需要完成的工作量減少;實際上是這種情況,還是捕獲的數量相當於一個等量的工作,我們只是獲得更好的可讀性?

+1

我想你應該在關閉lambda的'}'後添加一個額外的'()'來調用它。 – VTT

+0

@VTT:謝謝,我的壞! – mrclng

+0

這段代碼是否必須被綁定到'push_back'調用中?爲什麼不''*代碼在一個變量V */A.push_back(V)中準備一個向量;' –

回答

0

我認爲這很可讀,不是嗎?

#include <vector> 
std::vector<std::vector<double>> A; 

void test() 
{ 
    // lots of logic here 

    auto compute = [&]() -> std::vector<double> { 
     // compute logic here 
    }; 

    A.push_back(compute()); 
} 
+0

哇,我什至不知道這是可能的:) 但是這是否有任何其他影響相比,一個正常的函數調用? – mrclng

+0

@mrclng lambda只是創建函數對象實例的簡寫。 –

+0

但是,如果你在lambda定義之後從「計算邏輯」中改變了某些東西,這種情況會有效嗎?即所捕獲的變量是否會反映在lambdas定義或調用點時的變量? – mrclng