您的位置:首页 > 编程语言 > C语言/C++

Lambda Expressions in C++

2013-03-09 14:22 363 查看

关于Lambda表达式

许多编程语言提供了匿名函数,Lambda表达式是与匿名函数有关的编程方法。匿名函数就是一个只有函数实体,而没有函数名字的函数。Lambda表达式隐式的定义了一个函数对象类(有关函数对象简介),并且构造了一个该类的对象。可以把Lambda表达式看作是包含状态和可以访问封闭作用域外的变量的匿名函数。

函数对象 VS Lambda表达式

我们有时候会用函数指针和函数对象来解决问题。函数指针和函数对象都有利也有弊。
函数指针涉及最少的语法开销,比较简单。但它不能保存状态。
函数对象可以保存状态,但它需要定义一个类的语法开销。

而Lambda表达式吸取了函数指针和函数对象的优点,摒弃了它们的缺点。Lambda表达式像函数对象一样灵活并且可以持有状态,但是它的语法十分紧凑,不需要像函数对象一样去定义一个类。

下面是一个简单的例子(统计vector容器的偶数的个数),用来比较Lambda表达式和函数对象。
例子1,使用Lambda表达式:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
vector<int> vecInt;
for(int i=0;i<10;i++)
vecInt.push_back(i);
int evenCount=0;
for_each(vecInt.begin(),vecInt.end(),[&evenCount](int k){
cout<<k<<" ";
if (k%2==0)
{
cout<<"偶数"<<endl;
evenCount++;
}
else
cout<<"奇数"<<endl;
});
cout<<"偶数有 "<<evenCount<<"  个"<<endl;
}
运行结果:



上面的例子中,for_each的第三个参数就是一个Lambda表达式。关于Lambda的语法,在下一篇文章写。

例子2,使用函数对象:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

class Functor
{
public:
Functor(int &ec):_evenCount(ec){}
public:
void operator()(int n)
{
cout<<n<<" ";
if (n%2==0)
{
cout<<"偶数"<<endl;
_evenCount++;
}
else
cout<<"奇数"<<endl;
}

private:
int &_evenCount;
};
int main()
{
vector<int> vecInt;
for(int i=0;i<10;i++)
vecInt.push_back(i);
int evenCount=0;
for_each(vecInt.begin(),vecInt.end(),Functor(evenCount));
cout<<"偶数有 "<<evenCount<<"  个"<<endl;
}
上面的例子使用函数对象,和例子1中的Lambda表达式运行结果一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: