首页 > 代码库 > lambda表达式(一)

lambda表达式(一)

地点:基地

时间:2014.05.18

---------------------------------------------------------------------------

一、什么是lambda表达式

  lambda表达式表示一个可调用的代码单元,可理解为未命名的内联函数。和函数一样,具有返回类型,参数列表和函数体,但与函数不一样的是lambda可能直接定义在函数内部,定义格式如下:

[capture list](parameter list)->return type {function body}
其中[capture list] 是一个捕获列表,通常为空,然后为参数列表,与返回类型而言,lambda使用尾置返回来指定返回类型,即在形参列表后面使用 -> 符号跟上返回类型,推断规则为:如果函数体只是一个return语句,则返回类型根据返回的表达式类型推断而出,否则,只要它的函数体包含任何单一return语句之外的内容,返回都是void行的。lambda表达式最后是正常的函数体。

总的一句说:lambda表达式就像没有名字的函数,不过是有捕获列表使用尾置返回,捕获列表和函数体是必须有的。比如

auto f=[]{return 42;};
在这里,f是一个可调用的对象,它不接受参数所以无参数列表,返回类型也省略了,如果忽略返回类型则lambda会根据函数体中的代码推断出返回类型,单一return 推出是整型。f的调用方式和普通函数一样,使用调用运算符。测试用例如下:
#include<iostream>
auto f = []{return 42; };
int main()
{
	std::cout << f() << std::endl;
	return 0;
}

---------------------------------------------------------------------------

二、深入了解lambda表达式的使用

  调用lambda表达式时也需要初始化形参,实参形参也需类型匹配,与普通函数相区别的是,lambda不能有默认参数。比如我们要写一个谓词,该谓词通过比较两个string的大小返回一个布尔值。如下:

[](const string &a,const string &b){return a.size()<b.size();}
空的捕获列表表示该lambda不使用它所在函数中的任何局部变量。

现在,来完成一个单词按长度排序的程序,且保证排序的稳定性,可以实现如下:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
auto f=[](const string& str1, const string& str2)
{
	return str1.size() < str2.size();
};
int main()
{
	vector<string> mvec{ "This", "is", "my", "first", "lambda", "test", "example" };
	stable_sort(mvec.begin(), mvec.end(), f);
	for (auto s : mvec)
		cout << s << " ";
	cout << endl;
	return 0;
}