我在 MSDN 页面上阅读了此解释,了解 lambda 表达式相对于函子和函数指针的优点。 “保持状态”的能力是什么意思?它与通过引用或封闭范围内的值捕获某些变量的能力有关吗?
http://msdn.microsoft.com/en-us/library/dd293608.aspx http://msdn.microsoft.com/en-us/library/dd293608.aspx
在编写代码时,您可能会使用函数指针和函数
解决问题和执行计算的对象。两者都有功能
指针和函数对象各有优缺点:
函数指针涉及最小的语法开销,但它们并不
将状态保留在范围内;函数对象可以维护状态,但是
它们需要类定义的语法开销。
Lambda 表达式是一种编程技术,它结合了
函数指针和函数对象的优点,避免
他们的缺点。 Lambda表达式很灵活并且可以维护
状态,就像函数对象一样,其紧凑的语法消除了
需要函数对象需要的类定义。
Lambda 表达式使您能够编写更简单的代码
与等效的函数对象相比,更不容易出错。
以下示例将 lambda 表达式的使用与
使用函数对象。第一个示例使用 lambda 表达式
将向量对象中的每个元素打印到控制台
偶数或奇数。第二个例子使用函数对象来完成
同一个任务。
您能否指出一些有关主题范围、状态、维护状态、lambda 表达式的优点的相关参考资料?
函子和 lambda 都比普通函数具有这种能力。它是在函数调用之间记住内容的能力。普通函数具有静态变量,但这些变量是全局唯一的,如果您想要具有自己唯一状态的单独函数对象,那么这是不好的。这是一个函子类示例:
class Counter
{
int n;
public:
Counter() :n(0) {}
int operator()() { return n++; }
};
通过这个类,我可以创建一个充当函数的实例,每次调用它时,它都会记住 n 的前一个值,例如
Counter x;
cout << x() << '\n';
cout << x() << '\n';
cout << x() << '\n';
使用普通函数无法做到这一点。但你可以用 lambda 来做到这一点:
int n = 0;
auto x = [=]() mutable { return n++; };
cout << x() << '\n';
cout << x() << '\n';
cout << x() << '\n';
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)