Lambda
看似很难懂的语法,其实就是一个函数,只是这个函数省略了名字。
#include<iostream>
using namespace std;
int main()
{
auto demo = []()->int {};
return 0;
}
上段代码中,就是一个lambda表达式的基础语法
demo是一个Lambda表达式的一个对象。可以理解为相当于函数名,[]中则是代表了形参的类型下面将会一一介绍。
()中则是引用的形参列表,->后面为返回值的类型,{}则是函数体,具体的逻辑都可以写在这里。
下面看几个Lambda实例:
int main()
{
int a = 3,b = 4;
auto demo = [](int x,int y)->void {cout << "a = " << x << ",b = " << y << endl; };
demo(a, b);
return 0;
}
以上[]没有捕获任何变量,所以不能访问任何lambda表达式外部的值。使用demo调用lambda表达式,调用lambda表达式。
int main()
{
int a = 3;
auto demo = [&](int &x)->void { int z = 6; x = z;};
demo(a);
cout << "a = " << a << endl;
return 0;
}
[=] :用值的方式捕获所有变量
[&]:代表形参列表中所有参数都以引用的方式传递
[=, &foo] 以引用捕获变量foo, 但其余变量都靠值捕获
[&, foo] 以值捕获foo, 但其余变量都靠引用捕获
此外,Lambda表达式最大的作用其实是在和STL的联动中,代码如下
bool stcmp(int a, int b)
{
return a < b;
}
int main()
{
vector<int> demo{ 4, 2, 5, 7, 3, 1 };
vector<int> lbvec(demo);
sort(demo.begin(), demo.end(), stcmp);
for (int& i : demo)
{
cout << i << endl;
}
return 0;
}
这个是在没有使用Lambda的情况下,如果函数定义的远,需要来回切换。影响阅读效率。使用了Lambda的情况如下:
int main()
{
vector<int> demo{ 4, 2, 5, 7, 3, 1 };
vector<int> lbvec(demo);
sort(demo.begin(), demo.end(), [](int a, int b) {return a < b; });
for (int& i : demo)
{
cout << i << endl;
}
return 0;
}