目录
什么是lambda表达式:
C++11引入lambda表达式,可以说是函数对象的一个升级版,它允许以更紧凑的语法创建临时的、即时的函数对象。与传统的函数对象相比,lambda 表达式更为简洁,可以在需要时直接内联定义,并且可以捕获外部变量,提供更灵活的功能。
lambda表达式语法:
[捕获外部变量](形参列表)->返回值{操作代码};
如果返回值是void,那么“->返回值”是可以省略的
lambda表达式语法使用方法:
auto func1 = []()->void {cout << "hello world!" << endl; }; func1();
相当于
template<class T = void> class TestLambda01 { public: TestLambda01() {} void operator() ()const { cout << "hello world!" << endl; } }; int main() { TestLambda01<> t1;// 使用默认模板参数创建对象 t1();// 调用对象 }
auto func2 = [](int a, int b)->int { return a + b; }; cout << func2(20, 30) << endl;
相当于
template<class T = int> class TestLambda02 { public: TestLambda02() {} int operator()(int a, int b) { return a+b; } }; int main() { TestLambda02<> t2; cout << t2(20, 30) << endl; }
[捕获变量]
[]:表示不捕获任何外部变量
[=]∶以传值的方式捕获外部的所有变量
[ & ]∶以传引用的方式捕获外部的所有变量
[this]:捕获外部的this指针
[=, &a]:以传值的方式捕获外部的所有变量,但是a变量以传引用的方式捕获
[a,b]∶以值传递的方式捕获外部变量a和b
[a,&b ] : a以值传递捕获,b以传引用的方式捕获int a = 20, b = 10; auto func3 = [&]() { int temp = a; a = b; b = temp; }; func3(); cout << "a: " << a<< " "<< "b: " << b << endl;
(这里不能直接使用按值传递捕获变量,如果非要需要按之传递可以使用[x=std::move(x)]传递 ,move()函数可以将对象标记为可移动,而不是复制操作)
lambda在泛型算法中的使用
//lambda在泛型算法中的使用
//
//找到第一个小于65
auto it = find_if(vec.begin(), vec.end(), [](int a)->bool {return a < 65; });
if (it != vec.end())
vec.insert(it, 65);
for (int val : vec)
{
cout << val << " ";
}
cout << endl;
//for_each
for_each(vec.begin(), vec.end(), [](int a)
{
if (a % 2 == 0)
cout << a << " ";
});
cout << endl;
//[this] 捕获当前对象的this指针
function函数结合lambda
lambda表达式只能存在语句当中,如何保留写好的lambda可以重复使用,需要使用function函数
map<int, function<int(int, int)> > caculateMap;
caculateMap[1] = [](int a, int b)->int {return a + b; };
caculateMap[2] = [](int a, int b)->int {return a - b; };
caculateMap[3] = [](int a, int b)->int {return a * b; };
caculateMap[4] = [](int a, int b)->int {return a / b; };
cout << "选择:";
int choice;
cin >> choice;
cout << "10 + 15: " << caculateMap[choice](10, 15) << endl;