我真的很喜欢lambdas并且能够在C ++中使用它们是一种乐趣。但是,因为我已经习惯了Haskell,lambdas非常适合语法,我正在努力学习如何在C ++中使用它们而不会编写难以理解的混乱的长代码行。
所以,举个例子,假设我写了这个:
vector<double> foo(10,0.2);
for_each(foo.begin(), foo.end(), [](double x){ std::cout << x << " ";})
这不是那么难读,lambda表达式非常小。但是如果我在for_each中有两个或三个行长函数,这可能会成为我的问题 码阅读技能:
vector<double> foo(10,0.2);
randomNumberGenerator bar;
for_each(foo.begin(), foo.end(), [](double x){ std::cout << "hello!"; x+=bar()/(1+bar()); std::cout << x << " ";})
//sorry, I couldn't think of a less stupid example...
为了我的口味,这条线开始变得烦人的长而且难以阅读......
此案例的首选代码约定是什么?我应该写:
for_each(foo.begin(), foo.end(),
[] (double x) {
std::cout << "hello!"
x += bar()/(1+bar());
std::cout << x << " ";
});
或类似的东西?我仍然认为这种语法有点不自然,难以理解...... :(
答案 0 :(得分:9)
我通常会去
for_each(foo.begin(), foo.end(), [](double x) {
std::cout << "hello!"
x += bar()/(1+bar());
std::cout << x << " ";
});
我写了几百行lambda。
答案 1 :(得分:6)
如果您愿意,可以使用auto
单独命名lambda:
auto const baz = [](double x)
{
std::cout << "hello!"
x += bar()/(1+bar());
std::cout << x << " ";
};
std::for_each(foo.begin(), foo.end(), baz);
答案 2 :(得分:3)
嗯...
for_each(foo.begin(), foo.end(),
[] (double x)
{
std::cout << "hello!"
x += bar()/(1+bar());
std::cout << x << " ";
});
for (auto x : foo)
{
std::cout << "hello!";
x += bar()/(1+bar());
std::cout << x << " ";
}
答案 3 :(得分:2)
我喜欢将lambdas视为另一个函数声明,因此遵循我在其他函数中使用的相同约定:
// when lambdas are present, I break the enveloping method params
for_each(
foo.begin(),
foo.end(),
[] (double x)
// I also like to split the brackets, just like with any function
{
std::cout << "hello!"
x += bar()/(1+bar());
std::cout << x << " ";
}); // the closing parenthesis is left with the closing bracket
答案 4 :(得分:1)
我会说如果lambda的代码是多于一个或两个语句,它应该是一个单独的命名函数。
答案 5 :(得分:1)
发布我的
std::vector<int> a;
std::find_if(a.begin()
, a.end()
, [&](int i)
{
return i == 0;
});