Lambda表达式概述:用于创建匿名的函数对象,用于简化编程工作。
通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。
语法形式如下:
[函数对象参数] (操作符重载函数参数)mutable或exception声明 ->返回类型{函数体}
1.函数对象参数
标示一个Lambda表达式的开始,必须存在,不能省略。函数参数对象只能使用那些定义Lambda
为止时Lambda所在作用范围内可见的局部变量(包含Lambda所在类的this)
(1)[]:没有任何函数参数对象
(2)[=]:以值传递方式捕获Lambda所在范围内的所有局部变量。
(3)[&]:以引用传递方法捕获Lambda所在范围内的所有局部变量。
(4)this:函数体可以使用Lambda所在类的成员变量。
(5)[x,&y]:x以值传递捕获,y以引用形式捕获。
(6)[=,&z]:z以引用形式捕获,其他变量以值传递捕获。
(7)[&,x]:x以值传递形式捕获,其他变量以引用形式捕获。
2.操作符重载函数参数
参数列表,标识重载的()操作符,没有参数时,可以省略。参数可以使用值传递和引用传递。
3.mutable或者exception声明
可以省略。按函数参数按值传递时,加上mutable修饰后,可以修改传递进来的拷贝。
exception声明用于指定函数抛出的异常,可以使用throw(int)。
4.-> 返回值类型
标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方时,这部分可以省略。
5.函数体
标识函数的实现,不能省略,函数体可以为空。
示例
[](int x,int y) {return x+y;} 隐式返回类型
[](int& x) {++x;} 没有return语句,Lambda的函数返回类型为 'void'
[]() {++num} 没有参数,访问全局变量num
[] {++num} 省略参数
来看一个实例:
bool cmp(int &a, int &b)
{
ruturn a > b;
}
int main()
{
vector<int> data;
for (int i = 0; i < 5; i++)
data.push_back(i);
sort(data.begin(), data.end(), cmp);
for (int i = 0; i < data.size(); i++)
cout << data[i] << endl;
return 0;
}
上述代码中:对data中的元素进行排序后输出,algorithm库中默认的sort采用升序排列,当我们想用降序排列时需要添加一个比较函数cmp,作为参数传递给sort。在定义了函数bool cmp(int &a,int &b)后,我不能再用bool cmp(int &a,int &b)来定义其他的比较函数,比如:
bool cmp(int &a,int &b)
{
return (a%3)>(b%3);
}
当一个程序中,排序函数用的次数不多时,专门给排序函数起个名字污染命名空间似乎不合算,能不能不给它起cmp的名字,又能使用比较大小的功能呢?此时就需要用到匿名函数了。
int main()
{
vector<int> data;
for (int i = 0; i < 5; i++)
data.push_back(i);
sort(data.begin(), data.end(), [](int &a,int &b)->bool
{
return a>b;
});
for (int i = 0; i < data.size(); i++)
cout << data[i] << endl;
return 0;
}
其中
[](int &a,int &b)->bool{return a>b;}
就是Lambda表达式。假如有数组data,想生成保留偶数的新数组,代码如下:
int main()
{
vector<int> data;
vector<int> result;
for (int i = 0; i < 5; i++)
data.push_back(i);
for_each(data.begin(), data.end(), [&result](int &elem) {
if (elem % 2 == 0)
{
retult.push_back(elem);
}
});
for_each(result.begin(), result.end(), [](int &elem) {
cout << elem << endl;
});
return 0;
}
参考:https://www.cnblogs.com/jimodetiantang/p/9016826.html
https://www.jianshu.com/p/96e9dba6e7a9