当前位置: 首页 > news >正文

lambda表达式(C++11)

文章目录

    • C++98的缺陷
    • lambda表达式
    • lambda表达式语法
    • lambda表达式的常见用法

C++98的缺陷

在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法
如果待排序元素为自定义类型,需要用户定义排序时的比较规则

struct Goods
{
	string _name; // 名字

	double _price; // 价格
	Goods(const char* str, double price)
		:_name(str)
		, _price(price)
	{}
};

当我们想对这个类型根据价格的高低进行排序时,我们可以利用仿函数

struct ComparePriceLess
{
	bool operator()(const Goods& gl, const Goods& gr)
	{
		return gl._price < gr._price;
	}
};

但仿函数写法太复杂了,为了解决这一点,因此,在C++11语法中出现了Lambda表达式。

lambda表达式

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; });

lambda表达式语法

lambda表达式书写格式:[capture-list] (parameters) mutable -> return-type {statement }

lambda表达式各部分说明

[capture-list] : 捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来
判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。

(parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略

mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。mutable在大部分情况下省略

->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。

{statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。

注:参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为空

先看一个完整的lambda表达式

auto add = [x](int a) mutable -> int { x *= 2; return a + x; };

捕捉列表说明

[var]:表示值传递方式捕捉变量var
[=]:表示值传递方式捕获所有父作用域中的变量(包括this)
[&var]:表示引用传递捕捉变量var
[&]:表示引用传递捕捉所有父作用域中的变量(包括this)
[this]:表示值传递方式捕捉当前的this指针

注意:
语法上捕捉列表可由多个捕捉项组成,并以逗号分割。
比如:[=, &a, &b]:以引用传递的方式捕捉变量a和b,值传递方式捕捉其他所有变量
[&,a, this]:值传递方式捕捉变量a和this,引用方式捕捉其他变量

lambda表达式的常见用法

//自定义类型的排序
sort(v.begin(), v.end(),
	[](const Goods& p1, const Goods& p2) { return  p1._price > p2._price; });

相关文章:

  • java计算机毕业设计图书共享系统源代码+数据库+系统+lw文档
  • 用Python生成Hilbert矩阵
  • 云计算与云原生
  • JBoss安装并部署war包
  • VGG论文
  • Tableau1——条形图和直方图
  • 微信小程序新手向——界面布局
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • 宠物狗网页制作作业 保护动物网页设计模板 简单学生网页设计 静态HTML CSS网站制作成品
  • java毕业设计——基于java+Applet+access的综合测评系统设计与实现(毕业论文+程序源码)——综合测评系统
  • 索引的数据结构(2)
  • 利用霍夫变换进行车道线检测
  • 公众号题库系统-查题公众号必备
  • 【Java】集合框架和泛型(二)
  • 机器学习在分子模拟中的应用
  • 【Amaple教程】5. 插件
  • 03Go 类型总结
  • CSS盒模型深入
  • docker容器内的网络抓包
  • JS 面试题总结
  • laravel 用artisan创建自己的模板
  • mysql 数据库四种事务隔离级别
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 官方解决所有 npm 全局安装权限问题
  • 简单易用的leetcode开发测试工具(npm)
  • 软件开发学习的5大技巧,你知道吗?
  • 深度学习入门:10门免费线上课程推荐
  • 线上 python http server profile 实践
  • 白色的风信子
  • kubernetes资源对象--ingress
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (六)vue-router+UI组件库
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (算法二)滑动窗口
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NetCore部署微服务(二)
  • .project文件
  • @Controller和@RestController的区别?
  • @RequestBody与@ResponseBody的使用
  • @synthesize和@dynamic分别有什么作用?
  • [100天算法】-不同路径 III(day 73)
  • [1204 寻找子串位置] 解题报告
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [AX]AX2012 SSRS报表Drill through action
  • [C++]Leetcode17电话号码的字母组合
  • [InnoDB系列] -- SHOW INNODB STATUS 探秘
  • [LOJ 6213]「美团 CodeM 决赛」radar
  • [OIDC in Action] 3. 基于OIDC(OpenID Connect)的SSO(添加Github OAuth 2.0的支持)
  • [Redis] Redisson实现分布式锁