6

我在 MSDN 页面上阅读了这个解释,了解 lambda 表达式优于仿函数和函数指针的优势。“保持状态”的能力是什么意思?它是否与在封闭范围内通过 ref 或 value 捕获某些变量的能力有关?

http://msdn.microsoft.com/en-us/library/dd293608.aspx

在编写代码时,您可能会使用函数指针和函数对象来解决问题和执行计算。函数指针和函数对象都有优点和缺点:函数指针涉及最小的语法开销,但它们不保留作用域内的状态;函数对象可以保持状态,但它们需要类定义的语法开销。

Lambda 表达式是一种编程技术,它结合了函数指针和函数对象的优点并避免了它们的缺点。Lambda 表达式很灵活并且可以维护状态,就像函数对象一样,并且它们紧凑的语法消除了对函数对象所需的类定义的需要。与等效的函数对象相比,Lambda 表达式使您能够编写更简洁且不易出错的代码。

以下示例将 lambda 表达式的使用与函数对象的使用进行了比较。第一个示例使用 lambda 表达式向控制台打印向量对象中的每个元素是偶数还是奇数。第二个示例使用函数对象来完成相同的任务。

您能否指出一些有关主题范围、状态、维护状态、lambda 表达式优势的相关参考资料?

4

1 回答 1

12

函子和 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';

你不能用正常的功能做到这一点。但是你可以用 lambdas 做到这一点:

int n = 0;
auto x = [=]() mutable { return n++; };
cout << x() << '\n';
cout << x() << '\n';
cout << x() << '\n';
于 2012-07-04T06:58:48.547 回答