地点:基地
时间: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; }
lambda表达式(一)