2017-07-30 51 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