C++进阶 —— lambda表达式(C++11新特性)

目录

一,模板函数sort

二,lambda表达式


一,模板函数sort

        在C++98中,如对一个数据集合中的元素进行排序,可使用模板函数sort,如元素为自定义类型,需定义排序时的比较规则;随着C++的发展,人们开始觉的上面的写法太复杂了,为了实现一个算法algorithm,都要重新写一个类,如每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,都会非常不方便;

//模板函数sort,元素为内置类型
int arr[] = { 4,1,5,3,8,7 };
std::sort(arr, arr + sizeof(arr) / sizeof(arr[0]));
std::sort(arr, arr + sizeof(arr) / sizeof(arr[0]), greater<int>());
//模板函数sort,元素为自定义类型
struct Goods
{
	string _name;
	double _price;
};
struct Compare
{
	bool operator()(const Goods& gl, const Goods& gr)
    { return gl._price <= gr._price; }
};
int main()
{
	Goods gds[] = { { "苹果", 2.1 }, { "相交", 3 }, { "橙子", 2.2 }, {"菠萝", 1.5} };
	sort(gds, gds + sizeof(gds) / sizeof(gds[0]), Compare());
	return 0;
}

二,lambda表达式

        C++11引入了lambda表达式(又称匿名函数),在传递给函数参数的位置,快捷定义匿名函数对象;其实际是一个仿函数,编译器会生成一个匿名类(此类重载了()运算符);

//lambda表达式实际是一个匿名函数
Goods gds[] = { { "苹果", 2.1 }, { "相交", 3 }, { "橙子", 2.2 }, {"菠萝", 1.5} };
sort(gds, gds + sizeof(gds) / sizeof(gds[0]), 
[](const Goods& l, const Goods& r)->bool{return l._price < r._price;});

语法:[capture-list] (parameters) mutable -> return-type { statement }

  • [capture-list],捕捉列表;
    • 该列表总是在lambda函数的开始位置,编译器根据其来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量来供lambda函数使用;
  • (parameters),参数列表;
    • 与普通函数的参数列表一致,如不需要参数传递,可连同()一起省略;
  • mutable,取消其常量性;
    • 默认情况下lambda总是一个const函数,mutable可取消其常量性,使用该修饰符时参数列表不可省略(即使参数为空);
  • -> return-type,返回值类型;
    • 用追踪返回类型形式,声明函数的返回值类型,没有返回值时此部分可省略,返回值类型明确情况下也可省略,由编译器对返回类型进行推导;
  • { statement },函数体;
    • 该函数体内,除了可以使用参数外,还可以使用所有捕获到的变量;

注,在lambda函数定义中,参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为空;因此C++11中最简单的lambda函数为:[]{};该函数不能做任何事;

        lambda表达式实际上可以理解为无名函数,该函数无法直接调用,如想直接调用,可借助auto将其赋值给一个变量;

[] {};
int a = 3, b = 4, x = 10;
[=] {return a + 3; };
[&](int c) {b = a + c; };
auto fun1 = [=, &b](int c)->int {return b += a + c; };
fun1(10);
auto fun2 = [x](int a) mutable { x *= 2; return a + x; };
fun2(10);

[capture-list] 捕捉列表

捕捉列表描述了上下文中那些数据可被lambda使用,及使用的方式(传值、传引用);

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

注:

  • 父作用域指包含lambda函数的语句块;
  • 语法上捕捉列表可由多个捕捉项组成,以逗号隔开;
  • 捕捉列表不允许变量重复传递,否则编译报错;
  • 在块作用域意外的lambda函数捕捉列表必须为空;
  • 在块作用域中的lambda函数仅能捕捉父作用域中局部变量,捕捉任何非此作用域或非局部变量都会编译报错;
  • lambda表达式之间不能相互赋值,即使看起来类型相同;

函数对象与lambda表达式

        函数对象又称仿函数,即可以像函数一样使用的类对象,就是在类中重载了operator()运算符的类对象;实际上,底层编译器对于lambda表达式的处理方式,完全是按照函数对象的方式处理的,即如定义了一个lambda表达式,编译器会自动生成一个类,该类中重载了operator();

class Rate
{
public:
	Rate(double rate)
		:_rate(rate)
	{}
	double operator()(double money, int year)
	{ return money * _rate * year; }
private:
	double _rate;
};

int main()
{
	//函数对象
	double rate = 0.49;
	Rate r1 = (rate);
	r1(10000, 2000);
	//lambda表达式
	auto r2 = [=](double money, int year)->double {return money * rate * year; };
	r2(10000, 2000);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/25431.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

intel驱动程序和支持助理常见问题:不识别、无法检测等问题解决方法

起因&#xff1a; wifi驱动有点问题&#xff0c;于是想着更新一下官方的驱动&#xff0c;下载intel驱动程序和支持助理并安装完成后&#xff0c;打开成了这个样子&#xff0c;刷新多少次都没有用&#xff0c;就是不识别。 解决方法&#xff1a; 经过一波胡乱操作&#xff0…

【Linux入门】Linux权限及管理

【Linux入门】Linux权限及管理 目录 【Linux入门】Linux权限及管理Linux权限管理文件访问者的分类文件类型和访问权限&#xff08;事物属性&#xff09; 文件权限值的表示方法文件访问权限的相关设置方法目录的权限实现共享目录粘滞位目录权限总结 作者&#xff1a;爱写代码的刚…

算法基础学习笔记——⑫最小生成树\二分图\质数\约数

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法基础学习 目录 ✨最小生成树 &#x1f353;朴素Prim &#x1f353;Kruskal算法 ✨二分图 &#x1f353;匈牙利算法 ✨质数 &#x1f353;&#xff08;1&#xff09;质数的判定——试除法 &#x1f353;&#xff08;2&…

(转载)基于遗传算法的多目标优化算法(matlab实现)

1 理论基础 1.1 多目标优化及Pareto最优解 多目标优化问题可以描述如下&#xff1a; 其中&#xff0c;f(x)为待优化的目标函数&#xff1b;x为待优化的变量&#xff1b;Ib和ub分别为变量x的下限和上限约束&#xff1b;Aeq*xbeq为变量x的线性等式约束&#xff1b;A*x≤b为变…

数据库作业

目录 数据库teaching中的表结构和表记录。 问题&#xff1a; 答案&#xff1a; 数据库teaching中的表结构和表记录。 &#xff08;1&#xff09;学生信息表student    #student表结构      create table if not exists student (      studentno char(11) not…

c++ 11标准模板(STL) std::map(六)

定义于头文件<map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class map;(1)namespace pmr { template <class Key, class T, clas…

【Linux驱动】认识驱动(驱动的概念、驱动分类)

目录 1、什么是驱动&#xff1f; 2、应用程序调用驱动基本流程 3、file_operations 结构体 4、驱动的分类 1、什么是驱动&#xff1f; 驱动就是一段程序&#xff0c;能够获取外设或者传感器数据、控制外设。驱动获取到的数据会提交给应用程序。 在 Linux 中一切皆为文件&…

物联网GPRS模块流量计算

物联网GPRS模块流量计算 MQTT(消息队列遥测传输) 是ISO 标准下一个基于TCP/IP的消息发布/订阅传输协议。 一、TCP消耗流量计算 以太网数据包结构&#xff1a; 以太网首部 IP首部 TCP首部 APPL首部 用户数据 以太网尾部 以太网首部为14个字节 IP首部为20个字节 TCP首部…

【CesiumJS入门】(1)创建Viewer及相关配置项

前言 在上一篇博客中&#xff0c;我们直接在vue组件完成初始渲染并创建 DOM 节点后通过 const map new Cesium.Viewer(cesiumContainer)构建了一个地球场景。 而本篇&#xff0c;我们将会专门把地球创建的方法写在一个js文件中&#xff0c;以便后续的调用。 同时&#xff0…

【JavaSE】Java基础语法(三十二):Stream流

文章目录 1. 体验Stream流2. Stream流的常见生成方式3. Stream流中间操作方法【应用】4. Stream流终结操作方法【应用】5. Stream流的收集操作 1. 体验Stream流 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素把集合中所有以"…

torch_scatter.scatter()的使用方法

学习目标&#xff1a; 在学习PyG时&#xff0c;遇到了 scatter 这个函数&#xff0c;经过学习加上自身的理解&#xff0c;记录如下以备复习 学习内容&#xff1a; src&#xff1a;表示输入的tensor&#xff0c;接下来被处理&#xff1b;index&#xff1a;表示tensor对应的索引…

机器学习 day14 ( 神经网络 )

神经网络的发展 最开始的动机&#xff1a;是通过构建软件来模拟大脑&#xff0c;但今天的神经网络几乎与大脑的学习方式无关 我们依据大脑中的神经网络&#xff0c;来构建人工神经网络模型。左图中&#xff1a;一个神经元可以看作一个处理单元&#xff0c;它有很多的输入/树突…

chatgpt赋能python:Python创建一个Animal类介绍

Python创建一个Animal类介绍 Python是一种高级编程语言&#xff0c;其简单易学、灵活性强、可读性高以及强大的库使得Python非常受欢迎。在Python中创建类非常容易且非常常见&#xff0c;我们可以使用Python创建各种类型的类。今天&#xff0c;我们将讨论如何使用Python创建一…

【时空权衡】

目录 知识框架No.0 时空权衡一、基本思想 No.1 计数排序一、比较计数二、分布计数 No.2 散列法一、开散列&#xff08;分离链&#xff09;二、闭散列&#xff08;开式寻址&#xff09; 知识框架 No.0 时空权衡 一、基本思想 其实时空权衡&#xff1a;是指在算法的设计中&…

进程信号(Linux)

进程信号 信号入门身边的信号进程信号 产生信号终端按键产生信号调用系统函数向目标进程发信号killraiseabort 硬件异常产生信号由软件条件产生信号 阻塞信号信号其他相关常见概念在内核中的表示sigset_t信号集操作函数sigprocmasksigpending 捕捉信号内核如何实现信号的捕捉si…

分布式简要说明

1.分布式简要说明 《分布式系统原理与范型》定义&#xff1a; 分布式系统是若干独立计算机的集合&#xff0c;这些计算机对于用户来说就像单个相关系统。 分布式系统 (distributed system) 是建立在网络之上的软件系统。 随着互联网的发展&#xff0c;网站应用的规模不断扩…

SAP-QM-物料主数据-质量管理视图字段解析

过账到质检库存&#xff1a;要勾选&#xff0c;否则收货后库存不进入质检库存HU检验&#xff1a;收货到启用HU管理的库位时产生检验批&#xff0c;例如某个成品物料是收货到C002库位&#xff0c;该库位启用了HU管理&#xff0c;那么此处要勾选。但是如果勾选了&#xff0c;却收…

04.hadoop上课笔记之java编程和hbase

1.win查看服务 netstat -an #linux也有#R数学建模语言 SCALAR 2.java连接注意事项,代码要设置用户 System.setProperty("HADOOP_USER_NAME", "hadoop");3.伪分布式的好处(不用管分布式细节,直接连接一台机器…,适合用于学习) 4.官方文档 查看类(static |…

Python期末复习题库(下)——“Python”

小雅兰期末加油冲冲冲&#xff01;&#xff01;&#xff01; 1. (单选题)下列关于文件打开模式的说法,错误的是( C )。 A. r代表以只读方式打开文件 B. w代表以只写方式打开文件 C. a代表以二进制形式打开文件 D. 模式中使用时,文件可读可写 2. (单选题)下列选项中,以追加…

webpack的使用

一、什么是webpack&#xff1f; webpack是一个前端构建工具&#xff0c;目前比较主流的构建工具&#xff0c;自定义的模块比较多。 二、应用场景 vue、react、angular 都可以通过webpack构建全部可供访问的页面数量不超过500个 三、安装 通过npm方式在项目根目录下执行命令…