跟python一樣。。。c++11終於也有了lambda函式了。。。
個人感覺挺好用的,以下是個人的一些理解
基本的lambda函式:
[捕獲的變數](引數)->返回值型別
呼叫方法:
[捕獲的變數](引數)->返回值型別(實參1,……,實參n);
各部分的解釋:
引數是指傳遞給lambda函式的引數,如可以(int a) 、(int a,int b) 、(int a,……,int z)當然也可以是無引數的();
返回值型別就是lambda函式返回的那個值的型別(= =,好像解釋了等於沒解釋);
函式體是標識函式的實現;
返回值型別、引數、函式體都跟平常的函式差不多,只是返回值型別
換了個位置且前面多了個
->
,它們都可以被省略,如下面形式
[捕獲的變數](){}
注:當編譯器可以自動推斷出返回值型別才可以將返回值型別省略。
[捕獲的變數]是lambda函式的開始,方括號不可以省略,但「捕獲的變數"是可以省略的,其是用來傳遞給編譯器自動生成的函式物件類的建構函式的。
它可以捕獲從作用域開始到lambda函式所在行的所有區域性變數,使lambda函式能使用函式體外**獲的那些區域性變數。為什麼是區域性變數呢?因為它不能捕獲全域性變數(
int a=10;
int main()
()<
它可以是下面的幾種形式:
//不捕獲任何區域性變數,嘗試使用任何未捕獲的區域性變數是非法的,如下面**:
int main()
()<
[=] //以傳值方式捕獲作用域中的所有變數,但傳遞給lambda的值是常量,下面的例子揭示了這點
int main()
()<
[&] //以傳址方式捕獲作用域中的所有變數,可以在lambda函式中修改傳進去的值,且修改的值會影響原值,如下面的例子
[x] //以傳值的方式,只捕獲x,無法在lambda函式中使用其他未捕獲的變數
[&x] //以傳址的方式,只捕獲x,無法在lambda函式中使用其他未捕獲的變數,如下面的**是錯誤的。
int main()
()<
[=,&x] //除x以傳址方式進行捕獲,其他的區域性變數以傳值方式進行捕獲。
[&,x] //除x以傳值方式進行捕獲,其他的區域性變數以傳址方式進行捕獲。
也許有人會問,既然能傳遞引數,那還要這些捕獲的變數做什麼呢?
如下面這兩個**的返回結果是一樣的
int main()
(b)<
如計算某個陣列中值大於x的元素個數?
下面是乙個例子
int main()
; std::cout
(注:這樣寫並不是最好的,只是為了說明捕獲變數的用途才寫成那樣的。下面的寫法更簡便(雖然lambda也是函式物件類。但我沒辦法把它寫成乙個區域性變數都不用的形式
#includeint main()
; std::cout
使用lambda的好處
簡潔性:你可以不用特意去定義乙個只使用一次的函式。
方便性:如上面那個count_if的例子,你可以直接看到並修改函式體中的內容,如果不使用lambda函式,那你需要去定義乙個函式,假設你的工程中有很多的函式,那你可能會浪費一點時間去查詢你定義的那個函式。
lambda匿名函式
匿名函式 lambda函式是一種快速定義單行的最小函式,是從lisp借用來的,可以用在任何需要函式的地方。def f x,y return x y g lambda x,y x y g 2,3 優點 1 使用python寫一些執行的指令碼時,使用lambda可以省去定義函式的過程,讓 更精簡 2 對...
lambda匿名函式
lambda語句中,冒號前argumes是引數,可以有多個,可以用逗號隔開或其他形式,冒號右邊的是表示式,並將其結果返回。示例 f lambda x,y x y print f 2,3 6myadd lambda args sum args result myadd 1,3,4 print resu...
匿名函式lambda
在python中有個匿名函式特性非常的便捷和有用,用關鍵字lambda就可以宣告乙個匿名函式,所以很多時候直接稱呼為lambda函式。每次介紹新特性的時候,我們都要反問什麼是lambda函式呢?因為又叫匿名函式,所以是指沒有宣告函式名稱的函式,它和平時我們定義普通函式使用def關鍵字不同,lamda...