C++11引入了lambda表達式,使得程序員可以定義匿名函數,該函數是一次性執行的,既方便了編程,又能防止別人的訪問。
Lambda表達式的語法通過下圖來介紹:
這里假設我們定義了一個如上圖的lambda表達式。現在來介紹途中標有編號的各個部分是什么意思。
- Lambda表達式的引入標志,在‘[]’里面可以填入‘=’或‘&’表示該lambda表達式“捕獲”(lambda表達式在一定的scope可以訪問的數據)的數據時以什么方式捕獲的,‘&’表示一引用的方式;‘=’表明以值傳遞的方式捕獲,除非專門指出。
- Lambda表達式的參數列表
- Mutable 標識
- 異常標識
- 返回值
- “函數”體,也就是lambda表達式需要進行的實際操作
將上圖的代碼片段補充完整:
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;
運行結果為:
13
x: 10 y: 3
因為是以值傳遞的方式訪問x,y所以x,y的值並沒有發生改變
現在我們隊lambda表達式的基本語法已經有一些了解,下面來舉幾個例子。
首先這個例子說明如何向lambda表達式里面傳遞參數:
#include <iostream>
using namespace std;
int main()
{
int n = [] (int x, int y) { return x + y; }(5, 4);
cout << n << endl;
}
運行結果為:9
通過這個例子我們可以看出,通過“函數體”后面的‘()’傳入參數。
接下來這個例子可以看出,可以像調用函數一樣使用lambda表達式,但是感覺這種方式和普通函數的定義與調用就差不多了,這里只是學習使用方式而已。
#include <iostream>
using namespace std;
int main()
{
auto f = [] (int x, int y) { return x + y; };
cout << f(21, 12) << endl;
}
運行結果為:33
Lambda表達式與STL算法一起使用,自己寫測試代碼的時候經常用到排序、輸出數組什么的,通過下面列舉的幾個算法也比較方便:
#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表達式的嵌套:
#include <iostream>
int main()
{
using namespace std;
int m = [](int x)
{ return [](int y) { return y * 2; }(x) + 3; }(5);
cout << m << endl;
}
運行結果:13
以上代碼在VC10和VC11上都能順利編譯通過。感覺lambda表達式還是比較有意思的語法,也是我接觸的第一個VC11擴展。