Lambda表達式
很多編程編程語言都支持匿名函數(shù)(anonymous function)。所謂匿名函數(shù),就是這個函數(shù)只有函數(shù)體,而沒有函數(shù)名。Lambda表達式就是實現(xiàn)匿名函數(shù)的一種編程技巧,它為編寫匿名函數(shù)提供了簡明的函數(shù)式的句法。同樣是Visual Studio中的開發(fā)語言,Visual Basic和Visual C#早就實現(xiàn)了對Lambda表達式的支持,終于Visual C++這次也不甘落后,在Visual Studio 2010中添加了對Lambda表達式的支持。
Lambda表達式使得函數(shù)可以在使用的地方定義,并且可以在Lambda函數(shù)中使用Lambda函數(shù)之外的數(shù)據(jù)。這就為針對集合操作帶來了很大的便利。在作用上,Lambda表達式類似于函數(shù)指針和函數(shù)對象,Lambda表達式很好地兼顧了函數(shù)指針和函數(shù)對象的優(yōu)點,卻沒有它們的缺點。相對于函數(shù)指針或是函數(shù)對象復(fù)雜的語法形式,Lambda表達式使用非常簡單的語法就可以實現(xiàn)同樣的功能,降低了Lambda表達式的學(xué)習(xí)難度,避免了使用復(fù)雜的函數(shù)對象或是函數(shù)指針?biāo)鶐淼腻e誤。我們可以看一個實際的例子:
// LambdaDemo.cpp : Defines the entry point for the console application. //
#include "stdafx.h" #include <algorithm> #include <iostream> #include <ostream> #include <vector>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]) { vector<int> v; for (int i = 0; i < 10; ++i) { v.push_back(i); } for_each(v.begin(), v.end(), [] (int n) { cout << n; if (n % 2 == 0) { cout << " even "; } else { cout << " odd "; } }); cout << endl;
return 0; }
這段代碼循環(huán)遍歷輸出vector中的每一個數(shù),并判斷這個數(shù)是奇數(shù)還是偶數(shù)。我們可以隨時修改Lambda表達式而改變這個匿名函數(shù)的實現(xiàn),修改對集合的操作。在這段代碼中,C++使用一對中括號“[]”來表示Lambda表達式的開始,其后的”(int n)”表示Lambda表達式的參數(shù)。這些參數(shù)將在Lambda表達式中使用到。為了體會Lambda表達式的簡潔,我們來看看同樣的功能,如何使用函數(shù)對象實現(xiàn):
#include "stdafx.h" #include <algorithm> #include <iostream> #include <ostream> #include <vector> using namespace std;
struct LambdaFunctor { void operator()(int n) const { cout << n << " "; if (n % 2 == 0) { cout << " even "; } else { cout << " odd "; }
} };
int _tmain(int argc, _TCHAR* argv[]) { vector<int> v;
for (int i = 0; i < 10; ++i) { v.push_back(i); }
for_each(v.begin(), v.end(), LambdaFunctor()); cout << endl;
return 0; }
通過比較我們就可以發(fā)現(xiàn),Lambda表達式的語法更加簡潔,使用起來更加簡單高效。
出處:藍色理想
責(zé)任編輯:bluehearts
上一頁 VS 2010 C++的未來:0x 的新特性 [1] 下一頁 VS 2010 C++的未來:0x 的新特性 [3]
◎進入論壇計算機技術(shù)版塊參加討論
|