淺出匿名函式lambda

2021-06-16 14:34:14 字數 1968 閱讀 6438

跟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...