1. 程式人生 > >C++ lambda函式

C++ lambda函式

一、為什麼要有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
  1. 返回型別
    一般不用指定,會根據return的值自動判斷。
    需要注意的是,當函式體只有return語句時,會自動判斷,而除了return還有其他語句時,預設為void。

三、什麼時候使用lambda

  1. 演算法函式只接受一元謂詞時。
    開頭那個find_if可以用lambda改為:
auto wc = find_if(words.begin(),words.end(),
				[sz](const string &a)
				{return a.size() >= sz};
  1. 函式體很短時。
    lambda可以在使用的時候臨時寫,如果只有三兩句,用lambda很方便,每次使用時寫一下就行。如果多的話,還是用函式比較方便。