在C++ 03標準中,並無lambda這個概念,對於C++來講,boost庫提供了lambda的接口。在C++11中,引進了lambda表達式,這也多是面嚮對象語言中,比較晚引進這個概念的語言吧。 算法
在C++中,lambda表達式就像是一個匿名函數,保持狀態,並能夠訪問封閉範圍內可用的變量。許多編程語言都支持匿名函數這個概念,像C#,Java 8 ,Python等語言;C++語言就像是一個匿名函數,有函數體,可是沒有函數名稱。該函數是一次執行的,這樣,既方便了本身編程,也拒絕了其餘人的訪問,安全性也獲得提升。 編程
下面說說lambda表達式的構成: 安全
1: void AbsSort(float *x, unsigned n)
2: {
3: std::sort(
4: x, x + n,
5: [](float a, float b) //lambda表達式的引入標識
6: {
7: return std::abs(a) > abs(b) ? abs(a) : abs(b);
8: });
9: }
1,lambda引入了一個「[ ]」標誌,在標誌裏面能夠填「&」,「=」,也能夠像上述例子中不填。在括號中的標誌,表示lambda捕獲的數據是什麼形式的;在一般狀況下,這個「&」表示引用的方式,「=」表示賦值的方式。ps:這裏面有一點須要說明,就是引用和賦值的異同,不明白的童鞋請自行百度,google,或者看書腦補。 編程語言
2.在「[ ]」後面,括號中的 則是lambda的參數和參數類型,剩下的就是函數體了。這個要是看不懂的話,請翻書從新閱讀。 函數
基礎的東西介紹完了,那咱們來講說,lambda表達式是怎麼和stl算法一塊兒使用的: google
1: int main()
2: {
3: char *a = {1,4,6,2,3,5,9,7,8,0};
4: std::sort(a,a+10);
5:
6: for_each(a, a+10, [&](int i){ cout<< i <<" "; });
7:
8: return 0;
9:
10: }
這裏面的for_each 的做用是循環遍歷。有興趣的童鞋能夠考慮考慮 把lambda標誌」[ ]」裏面的「&」改爲「=」,看看輸出的結果是否同樣。 spa
再來看看lambda的嵌套,相似於for循環的嵌套哦: code
1: int main()
2: {
3: int m = [](int x)
4:
5: { return [](int y) { return y + 5; }(x) + 3; }(5);
6:
7: std::cout << m << std::endl;
8:
9: return 0;
10: }
在這個嵌套中,童鞋們思考幾個問題,這個例子和上面的幾個例子哪些方面存在不一樣,還有就是,lambda的參數是怎麼傳遞的?? 對象
總結:lambda表達式其實就是個語法糖,它並無增長編程語言的功能,只是增長代碼的可讀性(貌似對於沒有接觸過這種語法的人,應該是減小了代碼的可讀性),以上純屬我的能心得,若有錯誤,歡迎指正。 接口