我在MSDN页面上阅读了这个解释,了解lambda表达式优于functor和函数指针的优点。 “保留国家”的能力是什么意思?它是否与通过参考或值封闭范围捕获某些变量的能力有关?
http://msdn.microsoft.com/en-us/library/dd293608.aspx
编写代码时,您可能使用函数指针和函数 解决问题和执行计算的对象。两个功能 指针和函数对象有优点和缺点: 函数指针涉及最小的语法开销,但它们没有 保留范围内的国家;函数对象可以维护状态,但是 它们需要类定义的语法开销。
Lambda表达式是一种结合了 函数指针和函数对象的好处,并避免 他们的缺点。 Lambda表达式非常灵活且可以维护 state,就像函数对象一样,并且它们的紧凑语法会被删除 需要一个类定义,函数对象需要。 Lambda表达式使您能够编写不那么繁琐的代码 并且比等效的函数对象更不容易出错。
以下示例比较了lambda表达式的使用 使用函数对象。第一个示例使用lambda表达式 打印到控制台是否为矢量对象中的每个元素 偶数或奇数。第二个示例使用函数对象来完成 同样的任务。
你能指出一些关于主题范围,状态,维护状态,lambda表达式优势的相关参考吗?
谢谢和问候
答案 0 :(得分:8)
Functors和lambdas都具有超越正常功能的能力。它是在函数调用之间记住东西的能力。普通函数具有静态变量,但它们是全局唯一的,如果您希望单独的函数对象具有自己的唯一状态,那么这是不好的。这是一个示例仿函数类:
class Counter
{
int n;
public:
Counter() :n(0) {}
int operator()() { return n++; }
};
通过这个类,我可以创建一个充当函数的实例,每次调用它时,它都会记住先前的n值,例如
Counter x;
cout << x() << '\n';
cout << x() << '\n';
cout << x() << '\n';
使用普通功能无法做到这一点。但你可以用lambdas做到这一点:
int n = 0;
auto x = [=]() mutable { return n++; };
cout << x() << '\n';
cout << x() << '\n';
cout << x() << '\n';