天天看点

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;
}
           

继续阅读