Lambda函式到底是個什麼

2022-08-26 23:30:24 字數 2408 閱讀 4965

lambda函式是指簡單的**片段,通常認為是不值得命名的函式,它不能重複使用,能方便程式設計師使用,增強**可讀性,降低**出錯概率。

[ 捕獲列表 ]

(引數)

-> 返回型別

編譯器通常會計算lambda函式的返回型別,所以一般不需要指定返回型別,但少數情況編譯器可能無法判斷返回型別,還是需要指定返回型別。

c++定義了許多標準庫函式,比如std::for_each,用來迴圈

int

main()

; std::

for_each

(v.begin()

, v.

end(),

print()

);return

0;

如果只是在特定的地方使用一次的函式,還要編寫乙個完整的方法就會顯得繁瑣。

對於上面的這種使用場景,我們可以使用lambda函式來實現。

std::

for_each

(v.begin()

, v.

end(),

(int element)

);

[

&i](

)struct anonymous

inline

auto

operator()

()const

}

編譯器為每個lambda函式生成了如上的唯一閉包,捕獲列表將成為閉包中建構函式的引數,如果是按引用捕獲,那麼對應資料型別的成員會在閉包中建立。

lambda函式對**的效能沒有影響,反而能夠使**結構更加緊湊、易讀,**的編寫更加方便。

int

main()

;print()

;return0;

}

上面的**可以輸出

auto

main()

::(anonymous class)::

operator()

()const

:100

,200

捕獲列表

意義[ ] ( )

不捕獲外接變數

[=] ( )

所有都按值捕獲

[&] ( )

所有都按引用捕獲

[x] ( )

x按值捕獲

[&x] ( )

x按引用捕獲

[&,x] ( )

x按值捕獲,其它的按引用捕獲

[=,&x] ( )

x按引用捕獲,其它的按值捕獲

std::vector<

int> v1;

int total =0;

int value =5;

std::

for_each

(begin

(v1)

,end

(v1),[

&, value]

(int x)

);

在這個例子中,value會被按值捕獲,會儲存乙份拷貝的值,total會以引用的方式捕獲,

可以使用auto幫助儲存lambda函式

auto lambda_func_1 =[&

](int x)

;

auto removelistenerinvector =[&

](std::vector>

* listeners)

if(_indispatch ==0)

else

isfound =

true

;break;}

}};

還可以把lambda函式儲存在變數、陣列和vector中,把他們當作命名引數來傳遞

#include

#include

#include

double

eva(std::function<

double

(double

)> f,

double x =

2.0)

intmain()

;auto f1 =

(double x)

; std::cout <<

eva(f0)

<<

"\n"

; std::cout <<

eva(f1)

<<

"\n"

;return0;

}

C語言的函式到底是什麼

文章目錄 前言 一 什麼是函式?1.函式是乙個固定的乙個程式段,或稱其為乙個子程式。2.特徵 有三部分組成,除了可以實現固定運算功能,還有乙個入口和乙個出口 二 怎麼使用函式?1.函式的定義 2.函式的宣告 3.函式的呼叫和return語句 4.函式定義和宣告的辨析 二 函式使用示例 1.max函式...

REST,RESTful到底是個什麼?

0.rest不是 rest 這個單詞,而是幾個單詞縮寫。但即使那幾個單詞說出來,也無法理解在說什麼 不是要貶低人,是我自己也理解困難 1.rest描述的是在網路中client和server的一種互動形式 rest本身不實用,實用的是如何設計 restful api rest風格的網路介面 2.ser...

Python中的id函式到底是什麼?

python官方文件給出的解釋是 id object cpython implementation detail this is the address of the object in memory.由此可以看出 1 id object 返回的是物件的 身份證號 唯一且不變,但在不重合的生命週期裡...