学习记录——day42 C++ Lambda表达式
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 specifiednote: 'num' declared herenote: 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;//0c("i can't say anymore");cout<<num<<endl;//20return 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;
}