C++11引入了lambda表達(dá)式,使得程序員可以定義匿名函數(shù),該函數(shù)是一次性執(zhí)行的,既方便了編程,又能防止別人的訪問。 Lambda表達(dá)式的語(yǔ)法通過下圖來介紹:
這里假設(shè)我們定義了一個(gè)如上圖的lambda表達(dá)式。現(xiàn)在來介紹途中標(biāo)有編號(hào)的各個(gè)部分是什么意思。
將上圖的代碼片段補(bǔ)充完整: int x = 10; int y = 3; int z ; z = [=]()mutable throw() -> int { int n = x + y; x = y ; y = n; return n;}(); cout<<z<<endl; cout<<"x:"<<x<<"\t"<<"y:"<<y<<endl; 運(yùn)行結(jié)果為: 13 x: 10 y: 3 因?yàn)槭且灾祩鬟f的方式訪問x,y所以x,y的值并沒有發(fā)生改變
現(xiàn)在我們隊(duì)lambda表達(dá)式的基本語(yǔ)法已經(jīng)有一些了解,下面來舉幾個(gè)例子。
首先這個(gè)例子說明如何向lambda表達(dá)式里面?zhèn)鬟f參數(shù): #include <iostream> using namespace std; int main() { int n = [] (int x, int y) { return x + y; }(5, 4); cout << n << endl; } 運(yùn)行結(jié)果為:9 通過這個(gè)例子我們可以看出,通過“函數(shù)體”后面的‘()’傳入?yún)?shù)。
接下來這個(gè)例子可以看出,可以像調(diào)用函數(shù)一樣使用lambda表達(dá)式,但是感覺這種方式和普通函數(shù)的定義與調(diào)用就差不多了,這里只是學(xué)習(xí)使用方式而已。 #include <iostream> using namespace std; int main() {
auto f = [] (int x, int y) { return x + y; };
cout << f(21, 12) << endl; } 運(yùn)行結(jié)果為:33
Lambda表達(dá)式與STL算法一起使用,自己寫測(cè)試代碼的時(shí)候經(jīng)常用到排序、輸出數(shù)組什么的,通過下面列舉的幾個(gè)算法也比較方便: #include <iostream> #include <algorithm> #include <ctime> using namespace std;
int main() { int a[10] = {0};
srand(time(NULL)); generate(a,a+10,[]()->int { return rand() % 100; });
cout<<"before sort: "<<endl; for_each(a, a+10, [&](int i){ cout<< i <<" "; });
cout<<endl; cout<<"After sort"<<endl; sort(a,a+10); for_each(a, a+10, [&](int i){ cout<< i <<" "; }); return 0; }
Lambda表達(dá)式的嵌套: #include <iostream> int main() { using namespace std;
int m = [](int x) { return [](int y) { return y * 2; }(x) + 3; }(5);
cout << m << endl; } 運(yùn)行結(jié)果:13
以上代碼在VC10和VC11上都能順利編譯通過。感覺lambda表達(dá)式還是比較有意思的語(yǔ)法,也是我接觸的第一個(gè)VC11擴(kuò)展。
|
|