Lambda表达式相当于在函数中定义一个轻量版函数可以直接使用,也可以赋值给其他函数使用
一、定义格式
[捕获列表](函数形参列表){函数体}
捕获列表:分为值捕获和引用捕获
值捕获:值捕获时,表达式中的数据和外界的数据属于不同的数据,并且在非mutable的lambda表达式中值捕获数据可读不可写
[变量1,变量2,。。。,变量n]:将这些数据都进行值捕获
[=]:将外界的变量全部进行值捕获
[=,&变量1,&变量2]:除了将变量1和变量2进行引用捕获外,其他都是值捕获
引用捕获:表达式中的数据和外界数据属于相同的数据,对数据操作时可读可写
[&变量1,&变量2,。。。,&变量n]:将这些数据都进行引用捕获
[&]:将外界的变量全部进行引用捕获
[&,变量1,变量2]:除了变量1和变量2是值捕获外,其他都是引用捕获
#include <iostream>
using namespace std;
int main()
{
int num = 0;
int key = 1;
int value = 2;
//auto关键字
//auto 在C++中 除了是一种存储类型外 还有自动推导的作用
//auto num = 100;
//num 会被识别为整型
//一个auto定义多个变量时,类型要统一 auto key = 20,value = 10;
//使用auto定义指针
//auto *ptr = &num 与 auto ptr = &num 是相同的
//使用auto定义引用 只能为 auto &ref = num;
//auto一般用于循环
//auto不能作为函数参数使用
//定义lambda表达式 值捕获
auto f = [num,key,value](string msg)mutable->void
{
cout<<"Lambda f:: hello world "<<msg<<endl;
//无捕获
/*
cout<<num<<endl;
error: variable 'num' cannot be implicitly captured in a lambda with no capture-default specified
note: 'num' declared here
note: lambda expression begins here
*/
//[] 捕获 [=] 表示值捕获外界的所有数据
cout<<num<<key<<value<<endl;
//值捕获的数据 可读 不可写 (常属性) 与原数据不是同一个
//num = 20;
//error: cannot assign to a variable captured by copy in a non-mutable lambda
//关键字 mutable 可以取消值捕获数据 的常属性(可无)
num = 20; // 更改的是函数中的 num 不影响外界的 num
//->void 表示函数返回值类型为 ->void 可无 系统根据 return 后的数据类型推导
//无 return 默认返回值类型为 void
};
//定义lambda表达式 引用捕获
//[] 捕获 [&] 表示引用捕获外界的所有数据 [&,value] 表示值引用获外界除value外的所有数据
auto c = [&num,&key,&value](string msg)
{
num = 20; //引用捕获的数据和外界是同一个
cout<<"Lambda c:: hello world "<<msg<<endl;
cout<<num<<key<<value<<endl;
};
//调用函数
f("what can i say");
cout<<num<<endl;//0
c("i can't say anymore");
cout<<num<<endl;//20
return 0;
}
二、lambda表达式作为算法策略
#include <iostream>
#include <algorithm>
using namespace std;
//定义全局函数作为策略
int comp(int a ,int b)
{
return a > b; //前大后小
}
//定义仿函数作为策略
class comp1
{
public:
comp1(){}
int operator()(int a ,int b)
{
return a > b; //前大后小
}
};
int main()
{
int arr[] = {0,3,4,6,7,8,9,5};
int len = sizeof(arr)/sizeof (arr[0]);
//排序(快排)
sort(arr,arr + len);//不加策略 默认升序
for(auto val:arr)
{
cout<<val<<" "<<endl;
}
cout<<endl;
//全局
sort(arr,arr + len,comp);//加入 降序策略
for(auto val:arr)
{
cout<<val<<" "<<endl;
}
cout<<endl;
//仿函数
sort(arr,arr+len,comp1());
//lambda表达式
sort(arr,arr+len,[](int a,int b){return a>b;});
return 0;
}