C++ lambda函式
阿新 • • 發佈:2019-01-03
一、為什麼要有lambda函式?
舉個例子:
在words容器中找到滿足謂詞的元素。
find_if(words.begin(), words.end(), 謂詞);
這個謂詞可以看作一個布林函式,find_if對於每個元素,都會傳給謂詞判定,如果滿足,就返回這個元素的迭代器。
find_if只能接受一元謂詞,也就是說,謂詞的引數只能有一個,就是find_if傳給它的容器裡的元素值。
如果想找容器里長度大於6的string怎麼辦?
//謂詞 bool length6(string s) { return s.length > 6; } find_if(words.begin(), words.end(), length6);
那個6可以自由更換嗎?不行,因為find_if只能接受一個引數,那個size(也就是6)不能傳進去。
於是,lambda出現了。用它做謂詞,接受的引數不受限制。
二、lamba函式
1. 格式:
auto 函式名 = [捕獲列表] (引數列表) -> return type {函式體};
這裡引數列表和返回值可以省略,捕獲列表和函式體不能省。
auto f = []{return 3;};
呼叫形式:f()
2. 捕獲列表
捕獲列表裡的引數,是當前函式裡的變數。
int a = 3; auto f = [a]{return a;}; cout << f();//輸出的是3
捕獲的值分為兩種情況:
(1)拷貝捕獲。在函式定義之後,捕獲的值也就確定了,之後不能更改。
(2)引用捕獲。函式定義之後,捕獲的值與當前的值相同。
舉例:
size_t v1 = 42;
auto f = [v1]{return v1;};
v1 = 0;
cout << f();//輸出的是42
size_t v1 = 42;
auto f = [&v1]{return v1;};
v1 = 0;
cout << f();//輸出的是0
- 返回型別
一般不用指定,會根據return的值自動判斷。
需要注意的是,當函式體只有return語句時,會自動判斷,而除了return還有其他語句時,預設為void。
三、什麼時候使用lambda
- 演算法函式只接受一元謂詞時。
開頭那個find_if可以用lambda改為:
auto wc = find_if(words.begin(),words.end(),
[sz](const string &a)
{return a.size() >= sz};
- 函式體很短時。
lambda可以在使用的時候臨時寫,如果只有三兩句,用lambda很方便,每次使用時寫一下就行。如果多的話,還是用函式比較方便。