天天看點

c++(Lambda表達式)

c++

  • 參照資料:C++ Primer中文版 第5版 [(美)李普曼,(美)拉喬伊,(美)默著][電子工業出版社][2013.08][838頁]

Lambda表達式

  • 什麼是Lambda表達式:Lambda表達式是c++11的新特性之一,其本質就是一個可調用的代碼單元,我們可以直接将其了解成一個未命名的内聯函數(不過也可以命名)。不過Lambda表達式是可以寫在一個函數體内的。
  • Lambda的書寫格式:Lambda表達式與大多數函數相似,有自己的傳回類型,參數清單,函數體。不過Lambda還有自己獨有的補貨清單,這個清單用于捕獲Lambda所在的函數體中的一些變量。具體書寫格式如下:
    c++(Lambda表達式)
    開頭方括号内寫入捕獲清單,然後小括号内寫入參數清單,接着使用尾置傳回的方式來指明傳回值,然後是函數體。
  • 有關捕獲清單:由于Lambda表達式可以寫在函數體内,是以其理應可以去使用該函數内的局部變量,但是這裡有個特殊的文法,就是需要捕獲才能使用,捕獲清單為此而生,在捕獲清單中用逗号隔開寫入其所在函數内的變量名,便可将其捕獲在Lambda的函數體内使用這個變量。這一項可以為空但不可以省略。
  • 有關參數:參數部分可以直接省略,省略掉就是預設無參。
  • 有關傳回值:Lambda表達式的傳回值盡可使用尾置傳回來指定,特殊情況下,你甚至可以連尾置傳回指定都省略掉,當你的函數體隻有一句return時,Lambda表達式的傳回值類型就是這句return的傳回值類型。而如果你的函數體内除了一句return還有其他東西,那麼這時候再省略尾置傳回,函數的傳回值就預設為空了。
  • 有關命名:在一個Lambda表達式前加入一個auto變量指派語句,即可命名這個Lambda表達式。

例子部分

  • 首先舉一個例子,寫一個Lambda表達式,為其命名為so,并使用其與stable_sort配合為一個vector内置元素排序。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
	vector<string> ve = { "hello","world","hell","trewqwer","ewr" };
	auto so = [](const string& a, const string& b) {return a.length() > b.length(); };
	stable_sort(ve.begin(),ve.end(),so);
	for (int i = 0; i < ve.size(); i++)
		cout << ve[i] << endl;
	return 0;
}
           
  • 下一個例子,使用Lambda表達式捕獲一個數值,找到vector中第一個長度大于該數值的元素,傳回其疊代器,并輸出該元素
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
	vector<string> ve = { "hello","world","hell","trewqwer","ewr" };
	int sz = 5;
	auto fi = [sz](const string& a) {return a.length() > sz; };
	auto w = find_if(ve.begin(), ve.end(), fi);
	cout << *w << endl;
	return 0;
}
           

繼續閱讀