Lambda Expression vs Functor in C++

Cha*_*han 39 c++ lambda

我想知道在C++中我们应该在functor中使用lambda表达式.对我来说,这两种技术基本相同,甚至算法也比lambda更优雅,更清洁.例如,如果我想重用我的谓词,我必须一遍又一遍地复制lambda部分.所以lambda什么时候真正进入?

Ste*_*sop 18

lambda表达式创建了一个无名的函子,它是语法糖.

因此,如果它使您的代码看起来更好,则主要使用它.如果(a)你不打算重用仿函数,或者(b)你要重用它,但是从代码中完全与当前代码完全无关,为了分享它,你通常会发生这种情况.最终创建my_favourite_two_line_functors.h,并有不同的文件取决于它.

几乎与您键入任何代码行的条件相同,而不是将代码块抽象为函数.

也就是说,使用C++ 0x中的range-for语句,在某些地方你可能会使用仿函数,之后它可能会使代码看起来更好,现在将代码编写为循环体,而不是仿函数或者拉姆达.


Edw*_*nge 17

1)这是微不足道的,试图分享它是更多的工作而不是利益.

2)定义一个仿函数只会增加复杂性(由于必须制作一堆成员变量和废话).

如果这两件事都不对,那么也许你应该考虑定义一个仿函数.

编辑:似乎你需要一个例子,说明在一个仿函数上使用lambda会很好.干得好:

typedef std::vector< std::pair<int,std::string> > whatsit_t;

int find_it(std::string value, whatsit_t const& stuff)
{
  auto fit = std::find_if(stuff.begin(), stuff.end(), [value](whatsit_t::value_type const& vt) -> bool { return vt.second == value; });

  if (fit == stuff.end()) throw std::wtf_error();

  return fit->first;
}
Run Code Online (Sandbox Code Playgroud)

如果没有lambdas,你必须使用类似于现场构造一个仿函数的东西,或者编写一个外部可链接的仿函数对象,这些东西非常烦人.

顺便说一句,我想也许wtf_error是一个扩展.

  • @Paul Nathan:这是由匿名命名空间解决的. (2认同)

Wil*_*ley 11

Lambdas 基本上只是实现仿函数的语法糖(NB:闭包并不简单.)在C++ 0x中,你可以使用auto关键字在本地存储lambda,std :: function将使你能够存储lambdas,或传递它们以类型安全的方式.

查看有关C++ 0x维基百科文章.


Mar*_*ork 8

不重复的小功能.

关于仿函数的主要抱怨是它们与使用它们不在同一个地方.因此,您必须在上下文中找到并阅读仿函数到它所使用的位置(即使它只在一个地方使用).

另一个问题是仿函数需要一些布线来将参数引入仿函数对象.并不复杂但是所有基本的样板代码.锅炉板容易出现切割和粘贴问题.

Lambda尝试并解决这两个问题.但是如果函数在多个地方重复或者大于(不能想出适当的术语,因为它将是上下文敏感的)小,我会使用仿函数.