Lambda Expressions in C++

关于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表达式运行结果一样。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章