最近做题老被lambda表达式折磨(c++的class内部sort函数里不让自定义cmp函数,只能丢一个匿名函数进去),索性把这块东西学一学
首先是c++11 的lambda:
[函数对象参数] (操作符重载函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}
下面进行逐一分析:
[函数对象参数]:不可省略。函数对象参数是传递给编译器自动生成的函数对象类的构造函数,有以下形式
[]:空,没有任何函数对象参数,函数中不可用任何外部变量
[=]:函数体内可以使用lambda所在范围内所有可见变量(包括this),值传递
[&]:函数体内可以使用lambda所在范围内所有可见变量(包括this),引用传递
[this]:函数体内可以使用lambda所在类中成员变量
[a]:将a进行值传递
[&a]:将a进行引用传递
[a,&b]:a值传递,b引用传递
[=,&a,&b],除a和b按引用传递外,其他参数都按值进行传递
[&,a,b],除a和b按值传递外,其他参数都按引用传递
(操作符重载函数参数):可省略。就是函数的形参部分,和普通函数的传参方式类似
mutable 或 exception :可省略。mutable修饰后可以修改传递进来的拷贝,exception声明该函数抛出的异常
-> 返回值类型:可省略。函数的返回类型:当为void可省略,当只有一个return时编译器会自动进行推断
{函数体}:不可省略。
简单的说,lambda表达式和普通函数不同之处在于,多了函数参数对象用来确定函数中用到的外部变量的范围和传递方式,
同时原来返回值类型移到了形参列表后,其他地方都是差不多的
经典格式为
[] (int x, int y) -> int { int z = x + y; return z; }
此外,用auto关键字就可以存储lambda函数
auto my_lambda_func = [&](int x) { /* ... */ }; auto my_onheap_lambda_func = new auto([=](int x) { /* ... */ });
例子
我们拿sort来进行举例
struct Node{int x;}; class A{ public: int f(){ vector<string> v; v.push_back("123456"); v.push_back("654365746"); v.push_back("a"); /* 现在我们要将v中的字符串按字符串长度进行排序,这就需要我们自己定义sort的比较函数 这里[&]表示通过引用传递的方式引用外部的Node ,返回的类型会被自动推断 */ Node t; sort(v.begin(),v.end(),[&](string &a,string &b){ t.x=1; return a.size()<b.size(); }); for(auto x:v)cout<<x<<" "; } };