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表達式運行結果一樣。


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