【C++11】统一列表初始化,声明,新增容器,lambda表达式

目录

一、C++11简介

二、列表初始化

1.引入

2.使用

2.1 内置类型与容器

2.2 自定义类型

3.原理

三、声明

四、新增STL容器

1.array(静态数组)

2.forward_list(单链表)

五、lambda表达式

1.lambda表达式的构成与规则

2.应用

3.lambda的底层原理


一、C++11简介

C++11更像是一种从C++98/03中孕育出来的一种新的语言,C++11能更好的用于系统开发和库开发,语法更加泛化和简单化,更稳定安全,不仅功能强大,而且能提高程序员的开发效率。

二、列表初始化

1.引入

C++11扩大了用大括号括起来的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可以添加(=),也可以不添加。

2.使用

2.1 内置类型与容器
//内置类型初始化
int x1 = { 10 };
int x2{ 20 };//省略赋值符号
int x3{ 10 + 20 };
//数组
int arr1[5]{ 1,2,3 };//后面也默认为0
int arr2[]{ 1,2,3,4,5 };
//动态数组
int* arr3 = new int[5] {1, 2, 3, 4, 5};
//标准容器
vector<int> v1{ 1,2,3,4 };
v1 = { 4,5,6,7 };//支持赋值
map<int, int> m{ {1,1},{2,2},{3,3},make_pair(4,4) };
2.2 自定义类型
struct point
{int _x;int _y;point(int x, int y):_x(x),_y(y){printf("调用了构造函数\n");}
};
point pp{ 2,2 };
point* ptr = new point[2]{ {1,1},{2,2} };
//当没有构造函数时会兼容C语言的特性,当有构造函数时会调用构造函数

3.原理

统一初始化列表({})是一个initializer_list类型,在很多STL容器中,都提供了一个支持initializer_list类型构造函数:

在对操作符=进行重载的时候,也会有该类型对应的函数:

三、声明(decltype)

声明其实一共包括两部分,分别是auto自动推导类型,以及decltype自动推导类型+定义对象。auto在之前的章节里已经详细讲过,这里不多进行赘述。

int func(int a)
{return a;
}
int main()
{int x;double y = 2.2;decltype(x) z = 2;//讲z定义成和x一样的类型decltype(&x) p;//定义一个指针类型int(*pfunc1)(int) = func;//定义一个函数指针类型pfunc1指向funcdecltype(&func) pfunc3 = func;auto pfunc4 = func;//函数指针使用起来也非常方便,不过这里使用auto进行推导更加便捷//在vector定义类型的时候auto无法使用,decltype可以很好的帮助定义类型vector<int> v;vector<int>::iterator it = v.begin();vector<decltype(it)> vv;//这里可以使用decltype,但是无法使用autovv.push_back(it);return 0;
}

注意decltype在推导函数指针类型的时候,需要加&符号。而不能将函数名就当做地址了。

四、新增STL容器

STL中新增加了一些容器,比如unordered_map和unordered_set等,还为这些容器增加了一些接口,比如列表的初始化,右值引用版本提高效率等。

1.array(静态数组)

int a1[10];
array<int, 10> a2;
array<int, 10>::iterator it = a2.begin();

array相较于直接定义数组而言,引入了迭代器更好的兼容了STL的用法,并且由对越界的检测,因为它的底层是函数调用。

2.forward_list(单链表)

对于已经有了带头双向循环链表list来说,forward_list显得更加的鸡肋,它不支持头插头删(因为需要遍历到最后影响效率),当定点插入的时候会插入在元素的后面。(因为插入到前面需要再定义一个指向前一个节点的指针)

五、lambda表达式

1.lambda表达式的构成与规则

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

1.[capture-list]:捕捉列表,该列表出现在lambda的初始位置,编译器根据[]来判断带来的代码是否是lambda表达式,捕捉列表能够捕捉上下文中的变量供lambda使用。其实只能捕获上文中的数据。

[var]:表示获取某一个变量

[=]: 获取上文的所有变量

[&var]: 获取某一个变量的引用

[&]:获取上文变量的所有引用

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

3.mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性,使用改修饰符时,参数列表不可省略。

4.->return-type:返回值类型,用追踪返回形式声明函数的返回值类型,没有返回值(void)的时候可以将此部分省略。当返回值明确的情况下,也可以省略,由编译器对返回类型进行推导。

5.{statement}: 函数体,和普通函数使用方法相同。

可以把它理解成一个匿名函数。注意,它知识一个函数定义,真正想要使用函数需要进行函数调用。

2.应用

auto fun = [] {};//最简单lambda表达式
auto add1 = [](int a, int b)->int {return a + b; };
auto add2 = [](int a, int b) {return a + b; };//省略返回值,让编译器自动推导
cout << add1(1, 2) << endl;//和函数的调用方法相同
cout << add2(2, 3) << endl;
auto func = [] {cout << "hello lambda" << endl; };//没有参数
func();
int a = 10;
int b = 20;auto swap1 = [](int& x, int& y)//和函数一样交换数据的时候必须带引用{int z = x;x = y;y = z;};
swap1(a, b);
cout << a << " " << b << endl;

注意,如果lambda表达式在全局中,就算有上文数据的话,捕捉列表也必须为空。

3.lambda的底层原理

用一段最简单的代码为例:

auto func = [] {cout << "hello lambda" << endl; };//没有参数
func();
cout << typeid(func).name() << endl;

可以使用typeid类的name方法来查看一下lambda表达式的类型:

我们发现它的类型是一个类,其中<>中的长字符串是一个uuid,它是给编译器使用的,而不是给程序员使用的,经过一定的算法保证所有生成的uuid是不同的。

同时我们可以看一下汇编程序:

可以看到,调用lambda表达式其实就是调用该类的operator>()仿函数。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

自定义leaflet弹窗

修改leaflet弹窗默认样式 1.自定义弹窗元素 //添加标记点并绑定自定义弹窗&#xff0c;弹窗元素可以封装为一个函数等灵活处理就行L.marker([lat, longti], {icon: geoIcon, // 设置icon,icon为自定义的图标}).addTo(this.map).bindPopup(<div>新定义的弹窗</div>…

全同台加密综述

文章目录 一、FHE的定义与性质1、核心算法2、性质 二、构造思想三、全同态加密研究进展1、支持部分同态的 Pre-FHE 方案2、基于理想格的 第1代 FHE方案3、基于LWE的 第2代 FHE方案3、基于近似特征向量的 第3代 FHE方案4、支持浮点数运算的 第4代 FHE方案5、其他 FHE方案5.1、基…

python爬虫初体验(一)

文章目录 1. 什么是爬虫&#xff1f;2. 为什么选择 Python&#xff1f;3. 爬虫小案例3.1 安装python3.2 安装依赖3.3 requests请求设置3.4 完整代码 4. 总结 1. 什么是爬虫&#xff1f; 爬虫&#xff08;Web Scraping&#xff09;是一种从网站自动提取数据的技术。简单来说&am…

金融业场景化实战:如何高效度量研发效能并驱动业务增长

在软件研发趋于规模化的今天&#xff0c;企业纷纷意识到效能度量的重要性。宏观经济层面的压力、企业内部研发资源有限、监管要求不断提高&#xff0c;这些都成为了企业发展过程中的挑战。特别是在金融行业&#xff0c;业务方对研发团队提出了更高的效能要求&#xff0c;希望在…

【机器学习】--- 序列建模与变分自编码器(VAE)

在机器学习领域&#xff0c;序列建模与变分自编码器&#xff08;Variational Autoencoder, VAE&#xff09; 是两个至关重要的技术&#xff0c;它们在处理时间依赖性数据与复杂数据生成任务中都发挥着关键作用。序列建模通常用于自然语言处理、语音识别等需要保持顺序关系的任务…

道路流量监测摄像机

道路流量监测摄像机 是一种结合了监控摄像技术和交通管理的先进设备&#xff0c;旨在通过实时监测和分析道路上车辆的行驶情况&#xff0c;收集交通流量数据并进行统计分析。这种摄像机在城市交通管理、道路规划、交通安全等领域有着广泛的应用前景。 在城市交通管理中&#xf…

JAVA外卖霸王餐新纪元自主发布CPS优惠小程序平台

打造外卖霸王餐新纪元&#xff0c;自主发布CPS优惠小程序平台&#x1f389;&#x1f374; &#x1f680; 开篇&#xff1a;外卖界的革新风暴 &#x1f680; 厌倦了千篇一律的外卖优惠&#xff1f;想要在外卖的世界里也能享受“霸王餐”的待遇&#xff1f;今天&#xff0c;就带…

如何安装和注册 GitLab Runner

如何安装和注册 GitLab Runner GitLab Runner 是一个用于运行 GitLab CI/CD (Continuous Integration/Continuous Deployment) 作业。它是一个与 GitLab 配合使用的应用程序&#xff0c;可以在本地或云中运行。Runner 可以执行不同类型的作业&#xff0c;例如编译代码、运行测…

HTML中直接创建一个“onoff”图形开关包括css+script

1. HTML中直接创建一个“onoff”图形开关 下面是一个完整的HTML文档示例 在HTML中直接创建一个“onoff”图形开关&#xff08;通常指的是一个类似于物理开关的UI组件&#xff0c;可以切换开或关的状态&#xff09;&#xff0c;并不直接支持&#xff0c;因为HTML主要用于内容的…

Java设计原则

面向对象经典设计原则主要包括单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则、接口隔离原则&#xff0c;文本主要从JAVA面向对象程序设计语言类的基本特性&#xff08;封装、继承、多态&#xff09;、JDK的API设计三个方面描述这些原则的基本原理。 单一职责原则 …

SMS over IP原理

目录 1. 短消息业务的实现方式 2. 传统 CS 短消息业务中的发送与送达报告 3. MAP/CAP 信令常见消息 4. SMS over IP 特点概述 5. SMS over IP 中的主要流程 5.1 短消息注册流程(NR 或 LTE 接入) 5.2 短消息发送(MO)流程(NR 或 LTE 接入) 5.3 短消息接收(MT)流程(NR 或…

二百六十七、MySQL——海豚调度器创建MySQL库表

一、目的 为了方便部署&#xff0c;直接用海豚创建MySQL库表 二、实施步骤 2.1 准备好SQL文件&#xff0c;并上传海豚中 create database if not exists hurys_dc; use hurys_dc; SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; CREATE TABLE tb_holiday ( id int NOT …

TypeError: expected string or buffer - Langchain, OpenAI Embeddings

题意&#xff1a;类型错误&#xff1a;期望字符串或缓冲区 - Langchain&#xff0c;OpenAI Embeddings 问题背景&#xff1a; I am trying to create RAG using the product manuals in pdf which are splitted, indexed and stored in Chroma persisted on a disk. When I tr…

完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法,亲测有效!!!

完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01;…

【FreeRTOS】中的portYIELD_FROM_ISR(xHigherPriorityTaskWoken)有啥用?

1、大家都知道&#xff0c;在中断里&#xff0c;freertos经常有下面的写法&#xff0c;会调用portYIELD_FROM_ISR BaseType_t xHigherPriorityTaskWoken pdFALSE; vTaskNotifyGiveFromISR(xTaskToNotify, &xHigherPriorityTaskWoken); //xHigherPriorityTaskWoken可为NUL…

【创意无限,尽在Houdini!】解锁数字特效的魔法工具箱 -- Houdini 产品交流会,诚邀您的参与!

尊敬的先生/女士, 我们是 Houdini 产品厂商在亚太地区的经销商--八方在线科技有限公司。 Houdini 产品厂商诚挚地邀请您参加即将举办的 Houdini 产品交流会。本次交流会将为您展示 Houdini 软件的最新功能和应用&#xff0c;帮助您更好地了解这款领先的3D动画和视觉特效软件。 …

1.4 MySql配置文件

既然我们开始学习数据库&#xff0c;就不能像大学里边讲数据库课程那样简单讲一下&#xff0c;增删改查&#xff0c;然后介绍一下怎么去创建索引&#xff0c;怎么提交和回滚事务。我们学习数据库要明白怎么用&#xff0c;怎么配置&#xff0c;学懂学透彻了。当然MySql的配置参数…

Python办公自动化案例(五):分析文本数据的词频并形成词云图

案例:分析文本数据的词频并形成词云图 在文本分析中,词频分析是一种基本且重要的技术,它可以帮助我们了解文本中词汇的使用频率。通过词频分析,我们可以识别出文本的关键词汇,从而对文本内容有更深入的理解。词云图是一种将词频视觉化的方法,它通过不同大小的字体展示词…

GRE隧道在实际部署中的优化、局限性与弊端

GRE的其他特性 上一篇光讲解配置就花了大量的篇幅&#xff0c;还一些特性没有讲解的&#xff0c;这里在来提及下。 1、动态路由协议 在上一篇中是使用的静态路由&#xff0c;那么在动态路由协议中应该怎么配置呢&#xff1f; undoip route-static 192.168.20.0 255.255.255.0 …

Android ImageView支持每个角的不同半径

Android ImageView支持每个角的不同半径 import android.annotation.SuppressLint; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Resources; import android.content.res.Resources.NotFoundException; import an…