美团网网站建设 费用,淘宝新闻最新消息,wordpress字母头像,网络营销试题库及答案lambda lambda的介绍lambda的使用lambda的细节-捕捉列表 lambda的介绍
lambda是匿名函数#xff0c;再适合的场景去使用可以提高代码的可读性。 场景#xff1a; 假设有一个Goods类需要进行按照价格、数量排序
class Goods
{string name;size_t _price;//价格int num;/… lambda lambda的介绍lambda的使用lambda的细节-捕捉列表 lambda的介绍
lambda是匿名函数再适合的场景去使用可以提高代码的可读性。 场景 假设有一个Goods类需要进行按照价格、数量排序
class Goods
{string name;size_t _price;//价格int num;//数量
};要是对一个类进行排序可以使用库函数sort(),但是sort()的最后一个参数是决定按照哪个成员排序以及是排升序还是排降序的所以最后一个参数就需要写成仿函数假设用价格排升序
struct ComparePriceGreater
{bool operator()(Goods g1,Goods g2){return g1.priceg2.prices;}
};
//然后再传仿函数
sort(容器.begin(),容器.end(),ComparePriceGreater())这样排列组合就需要写四个仿函数那这样就会减低代码的可读性如果使用lambda就可以减少代码量加强代码的可读性。
sort(容器.begin(),容器.end(),[](const Goods g1, const Goods g2)
{return g1.priceg2.price };)lambda的使用
lambdad的组成部分capture-listmutable-return-type{statement} [capture-list]:叫做补做列表该列表总是出现在lambda函数的开始位置编译器根据[]来判断接下来的代码是否为lambda函数捕捉列表能够捕捉上下文中的变量供lambda函数使用。 (parameters):叫做参数列表和函数的参数列表是一样的没有参数的时候可以省略 mutable:默认情况下lambda函数总是一个const函数mutable可以取消其常量性。使用该修饰符时参数列表不可省略即使参数为空。 -return-type:返回值类型。用追踪返回类型形式声明函数的返回值类型没有返回值时此部分可以省略。返回值类型明确情况下,也可省略由编译器对返回类型进行推导。 {statement}:函数主体在该函数体内除了可以使用其参数外还可以使用所有捕获到的变量。
int main()
{auto add [](int a)mutable-int {return a; };cout add(1) endl;return 0;
}需要注意函数体写完之后要加上;
lambda的细节-捕捉列表
[]捕捉列表可以捕捉程序上下文中的变量给函数体使用是值传递还是应用传递。 [var]:值传递捕捉var []:值传递捕捉此作用域中的所有变量 [var]:引用传递捕捉var []:引用传递捕捉此作用域中的全部变量 [this]:值传递捕捉this指针 注意点
捕捉传递可以是多个捕捉项如[,a,b]不能重复传递捕捉同一个变量如[,a]lambda是一个匿名函数要用auto来接收或者function和bind包装器lambda若是全局的捕捉列表一定要为空两个相同的lambda不可以赋值lambda只可以捕捉本作用域的局部变量捕捉全局和非此作用域的变量会报错
例子 写一个交换两个数的lambda
int main()
{int a 1;int b 2;auto Swap []() mutable{int tmp a;a b;b tmp;};Swap();cout a b endl;return 0;
}这里是捕捉属于值传递给函数体说明实际是交换不了a和b的mutable是为了解除捕捉过来的a,b的const属性。
int a 1;
int b 2;
auto Swap []() mutable{int tmp a;a b;b tmp;};
Swap();
cout a b endl;
return 0;这里是捕捉给函数体使用是引用传递可以交换ab的值这里可以不加mutable因为引用类似于指针初始是不带const属性的。