C++11 lambda+包装器+可变参数模板

C++ Lambda详解
本文深入讲解C++中的Lambda表达式,包括其定义、基本规则、实现原理及应用场景,并探讨了如何利用lambda表达式简化代码,提高编程效率。

lambda表达式

(1).什么是lambda

假设有这样一个类

struct Goods
{
   
   
string _name;  // 名字
double _price; // 价格
int _evaluate; // 评价
}

现在要将商品分别按照名字,价格三种方式排序,为此我们必须写三个仿函数,但这个有点麻烦,因为一旦比较的逻辑不一样,就得多实现一个类,所以c++11出现了与局部深度绑定的lambda表达式,其本质上是一个匿名函数。
eg:

vector<Goods> v = {
   
    {
   
    "苹果", 2.1, 5 }, {
   
    "香蕉", 3, 4 }, {
   
    "橙子", 2.2,
3 }, {
   
    "菠萝", 1.5, 4 } };
sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2){
   
   
return g1._price < g2._price; });
sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2){
   
   
return g1._price > g2._price; });

(2).lambda基本规则

格式[capture-list](parameters) mutable->return-type-{statement}

[capture-list] :捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文的变量供lambda函数使用
(parameters):参数列表,与普通函数的参数列表一致,如果不需要传参,则可以与()一起省略
mutable:默认情况下,lambda函数总是一个const函数,即捕捉过来的参数自动加了const,如果需要改变参数const’属性,需在()后加mutable
->returntype:返回值类型,用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略,返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。
{statement}:函数体。除可以使用参数外,还可以使用所有捕获到的变量
小结:参数和返回值可以省略,捕捉列表和函数体不能省略。

[capture-list] (parameters) mutable -> return-type {
   
    statement }
    	 捕捉列表  参数  返回值  函数体
	最简单的lambda表达式,该表达式无意义
	[] {
   
   };
	auto Add1 = [](int x, int y)->double {
   
   return (x + y) / 3.0; };
	cout << Add1(2, 3) << endl;//Add1其实就是一个局部匿名函数
	int x = 3;

	int a = 4, b = 5;
	auto Add2 = [a, b,x] ()mutable//无参数可以直接省略
	{
   
   
		a = a + 3<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天少点debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值