C++11 lambda 表達式

                                    C++11 lambda表達式

 

        在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表達式其實就是個語法糖,它並無增長編程語言的功能,只是增長代碼的可讀性(貌似對於沒有接觸過這種語法的人,應該是減小了代碼的可讀性),以上純屬我的能心得,若有錯誤,歡迎指正。 接口

相關文章
相關標籤/搜索