C++11新特性(语法糖,新容器)
距离C++11版本发布已经过去那么多年了,为什么还称为新特性呢?因为笔者前面探讨的内容,除了auto,范围for这些常用的,基本上是用着C++98的内容,虽说C++11已经发布很多年,却是目前被使用最广泛的版本。因为新版本的发布,编译器要很长时间才能支持新语法新特性,有一句话说得挺好,C/C++之所以强大,是因为它们的编译器很强大。C++23版本已经发布,但真想普遍使用不知道还得多少年呢?尤其是C/C++这种基本用于底层架构的语言,底层代码不敢改,也不愿意改。但不管怎么说,日后的开发是离不开C++11的,C++11可以说是C++历年来最大的版本更新,多了很多非常强大的东西,但也多了很多鸡肋,内容太多太多,不可能全部提完。故而笔者着重讲述必须要掌握的,用处一般的就简单提提,剩下的,大家碰到了再查,C++11新特性部分将分为多篇内容,让我们开始吧
目录
array & forward_list
auto,typeid,decltype
范围for
统一的列表初始化
统一的列表初始化原理
nullptr
array & forward_list
C++11新更新了两个容器,分别是array,forward_list
array本质上是对C语言的数组进行了一层封装,加上了模板,迭代器等功能

array的定义如上,它也是一个静态数组,声明时需要指定类型和大小,整体使用下来并不比C语言的数组强多少,唯一比C语言数组好用的就是会检查下标,我们知道C语言的数组越界读是不会报错的,越界写也仅是抽查,所以不小心写错下标可能会造成一些问题
但是vector也能检查下标呀,我为何不使用vector呢,况且vector功能比array强大多了,所以array算是C++11里比较鸡肋的一个
forward_list是新推出的单链表,在C++推出STL库时,只有list,list的底层实现我们前面也探讨过了,本质是双链表。forward_list算是list的青春版,因为双链表的节点要链接前后,所以会比单链表多存储一个指针大小,如果在内存空间特别紧凑,并且单链表足够满足使用场景,可以考虑使用forward_list,其基础功能如下,只能头插和尾插

auto,typeid,decltype
auto,typeid,decltype都是C++11推出的和类型相关的特性功能
auto是语法糖,为什么叫语法糖,因为让人用的舒服,auto是很好用的,在一些场景下,有的类型被层层封装,导致其类型名很长,有了auto就不用我们自己去推断类型

这仅是auto应用场景之一,后面我们会见到大量使用auto的场景,例如范围for就是使用auto来推导要迭代的类型,auto是根据初始值来进行类型推导的,也就是说你要使用auto推导必须给出一个初始值,否则没有意义
auto test;
//没有初始值,无意义的推导
如果你想把某个变量或者表达式的类型给打印出来看看,那么就可以使用typeid,具体用法如下图,typeid是一个类,把想知道类型的变量或者表达式传过去,调用name

调用name之后,会返回一个字符串,字符串的内容即是推导出的类型
如果现在提一个过分一点的要求,我不仅要你推导出类型,还要用你推导的结果再声明出同类型的对象,使用typeid是做不到了,因为它返回的是字符串,不可能作为类型声明符,但是decltype可以做到,看看decltype是如何使用的

上图用decltype推导出test_1的类型,并用推导结果声明了变量test_2
这里的应用场景看着比较傻,类型推导在模板里应用比较广泛,如下

按照常规方法是不好解决的,因为我们不明确 T1 和 T2的类型到底是什么,就没有办法给变量ret_val确定类型,但是现在我们有了auto 和 decltype就很容易解决这个问题

范围for
范围for也是C++11中使用体验不错的语法糖,范围for本质就是循环遍历对象,范围for的出现帮我们节省了不少时间,如下列程序

不仅内置类型可以用,容器也是可以使用范围for的,如下图程序

只要容器支持迭代器,那么它就可以使用范围for,因为容器使用范围for本质还是在调用容器中实现的迭代器 ,但是范围for使用起来方便不少,使用汇编可以一窥细节
//测试代码
int main()
{vector<int> test;for (int i = 1; i <= 10; i++){test.push_back(i);}//迭代器auto it = test.begin();while (it != test.end()){cout << *it << " ";it++;}cout << endl;//范围forfor (auto& t : test){cout << t << " ";}return 0;
}

可以看出两者都是在调用迭代器,我们手动调用的begin()和end()是经过封装过的,范围for则直接调用迭代器的底层实现,在容器中范围for本质和迭代器没区别,但是用的更省心
使用范围for时,如果auto推导类型后跟上&,就是引用调用,可以读写原数据
如果没有跟上&,那么就是传值调用,修改并不会影响原数据
如果只想读不想写的话推荐 const auto & 这种写法,减少拷贝消耗
统一的列表初始化
平时我们给C语言的数组进行初始化操作时,可以使用一对花括号进行赋值" { } "
//使用花括号给数组进行初始化赋值
int arr[] = {1, 2, 3, 4, 5, 6};
其实这样的初始化还挺好用的,我们平时使用vector进行赋值时就没那么方便,如果赋值有顺序还好,没顺序的话还要自己手动push_back,于是C++11提出了统一初始化列表,也就是说让STL中的容器也够支持使用" { } "来进行赋值,如下图

可不仅仅是只有vector能使用,其它容器也是支持的,如下图的list和map

你甚至可以直接不写赋值符号 "=" ,同样能完成初始化,不仅可以用于数组,容器,对于单个内置类型也是可以使用{}来初始化的,如下图

除了内置类类型和STL库中的容器支持这种初始化,自定义类型也是支持的

需要注意的是,使用{}初始化自定义类型,是去调用自定义类型的构造函数,由此看来,C++11之后确实可以统一使用{ }来初始化,这也是为什么叫统一的列表初始化
统一的列表初始化原理
像数组可以使用{}进行初始化可以理解,毕竟原生的编译器就支持,但是容器也支持{}初始化是怎么做到的呢? 其实实现原理也不难,我们以vector为例,既然是初始化,那我们就紧盯构造函数,打开资料库查查C++11的构造函数有没有发生变化

果然,我们发现,构造函数中多了一个initializer list,而这就是统一列表初始化实现的秘密,可以看出该构造函数使用的是initializer_list,我们查一下这是个什么东西

我们大概能理解,使用{ }时,会将里面的内容放到initializer_list容器中存放起来,然后把该容器内的值拷贝给vector,如此就完成了初始化操作,知道原理了,我们可以自己尝试给之前写的vector也添加这么个功能
vector(std::initializer_list<T> _lt)
{_begin = new T[_lt.size()];_finish = _begin + _lt.size();_end = _begin + _lt.size();auto _vtp = _begin;auto _ltp = _lt.begin();while (_ltp != _lt.end()){*_vtp = *_ltp;_vtp++;_ltp++;}
}
这个只能构造,若想拷贝赋值的话,可以重载一个operator=( std::initializer_list<T> _lt)
具体定义如下,别忘了包含头文件initializer_list
vector<T>& operator=(std::initializer_list<T> _lt)
{vector<T> tmp(_lt);std::swap(_start, tmp._start);std::swap(_finish, tmp._finish);std::swap(_endofstorage, tmp._endofstorage);return *this;
}
nullptr
出现nullptr是因为C++错误的将库中的NULL定义为0,这就会导致很多问题,因为NULL不仅表示一个空指针,还是一个字面常量值0,如下述代码

简单写个代码验证其中的危害性
int main()
{int p = NULL;cout << p << endl;int t = 0;if (t == NULL) cout << "t是一个空指针" << endl;return 0;
}

运行结果如上,t被错误的判断为一个空指针,事实上,t连指针都不是。错已经错了,直接改NULL会影响原先的代码,为了解决这个问题,C++又推出了nullptr来代替NULL
nullptr则是正确的定义 (void*)0,所以C++中请使用nullptr来表示空指针
至此,本篇文章就结束了,总体下来还算轻松,很多内容都是见过多次的老朋友了,其中也多了不少好用的特性,像统一初始化列表,范围for这种就快快用起来吧
相关文章:
C++11新特性(语法糖,新容器)
距离C11版本发布已经过去那么多年了,为什么还称为新特性呢?因为笔者前面探讨的内容,除了auto,范围for这些常用的,基本上是用着C98的内容,虽说C11已经发布很多年,却是目前被使用最广泛的版本。因…...
开机可用内存分析Tip
一、开机内存简介 开机内存指的是开机一段时间稳定后的可用内存。一般项目都会挑选同平台其他优秀竞品内存数据,这个也是衡量性能的一个重要标准。所以要进行开机内存检测,同时优化非法内存进程占用。 二、测试前期核查任务 开机内存测试前要进行测试机…...
【Python基础】4. 基本语句
文章目录 注释(Comment)解释伴随行文本编码问题 输入输出语句(Input & Output)输出语句普通输出格式化输出(3种)format 格式总结 输入语句 基本语句if 语句match 语句(Python3.10 新增&…...
兼顾友好与安全,隐私协议 Unijoin 助推新一轮 Web3 浪潮
区块链本身不仅崇尚去中心化,同时也崇尚公开透明,虽然这正在让 DAO 治理等变得更加公平,但它同时也是一把双刃剑,个人交易者尤其是一些巨鲸交易者的所以链上交易都被公之于众,这似乎并不是他们想要的结果。 所以从加密…...
TCP端口崩溃,msg:socket(): Too many open files
一、现象 linux系统中运行了一个TCP服务器,该服务器监听的TCP端口为10000。但是长时间运行时发现该端口会崩溃,TCP客户端连接该端口会失败: 可以看到进行三次握手时,TCP客户端向该TCP服务器的10000端口发送了SYN报文,…...
基于Laravel 5.6的运动健身类小程序前后端源码
基于Laravel 5.6的运动健身、健康类小程序前后端源码,一套比较基础的运动健康、健身类小程序源码。朋友自己无聊写的,比较基础,有需要的可以拿去修修改改升级开发一下。 使用宝塔安装,比较省事,PHP相关的扩展需要启用…...
NodeMCU ESP8266硬件开发板的熟悉
文章目录 硬件开发环境的熟悉基础介绍什么是 ESP8266 NodeMCU?NodeMCU芯片ESP12-E 模组开发板 ESP8266 版本引脚图Power GND I2CGPIOADCUARTSPIPWMControl 总结 硬件开发环境的熟悉 基础介绍 什么是 ESP8266 NodeMCU? ESP8266是乐鑫开发的一款低成本 …...
计算机毕业设计 基于SSM的在线预约导游系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
Mac 挂载 Alist网盘
挂载服务器的Alist 网盘到 Mac mac,使用的是 CloundMounter 这个软件进行挂载 http://ip:port/dav/ 需要在末尾加上 /dav/ 在一些服务器上,为了提供WebDAV服务,需要在URL地址的末尾添加"/dav/“。这是因为WebDAV协议规定了一些标准的URL路径&#x…...
【多模态融合】TransFusion学习笔记(1)
工作上主要还是以纯lidar的算法开发,部署以及系统架构设计为主。对于多模态融合(这里主要是只指Lidar和Camer的融合)这方面研究甚少。最近借助和朋友们讨论论文的契机接触了一下这方面的知识,起步是晚了一点,但好歹是开了个头。下面就借助TransFusion论文…...
(二)正点原子STM32MP135移植——TF-A移植
目录 一、TF-A概述 二、编译官方代码 2.1 解压源码 2.2 打补丁 2.3 编译准备 (1)修改Makfile.sdk (2)设置环境变量 (3)编译 三、移植 3.1 复制官方文件 3.2 修改电源 3.3 修改TF卡和emmc 3.4 添…...
将二叉搜索树转化为排序的双向链表
链接: LCR 155. 将二叉搜索树转化为排序的双向链表 题解: /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node() {}Node(int _val) {val _val;left NULL;right NULL;}Node(int _val, Node* _left…...
电脑dll丢失应该怎么解决,dll文件丢失怎么恢复方法分享
DLL(Dynamic Link Library,动态链接库)是一种可执行文件,它包含了在程序运行时需要调用的代码和资源。DLL 文件的主要作用是实现代码和资源的共享,这样在多个程序之间就可以避免重复的代码和资源,从而节省系…...
通达信和同花顺能否实现程序化自动交易股票,量化交易如何实现?
以下写给正在寻找自动交易接口的朋友,首先,不是那种设置个简单条件的条件单,或者某些客户端上形同鸡肋的策略交易,那些策略根本称不上策略,还有各种限制,不支持这个不支持那个,可设置的参数也不…...
基于Kylin的数据统计分析平台架构设计与实现
目录 1 前言 2 关键模块 2.1 数据仓库的搭建 2.2 ETL 2.3 Kylin数据分析系统 2.4 数据可视化系统 2.5 报表模块 3 最终成果 4 遇到问题 1 前言 这是在TP-LINK公司云平台部门做的一个项目,总体包括云上数据统计平台的架构设计和组件开发,在此只做…...
Linux CentOS7 vim寄存器
计算机中通常所说的寄存器Register一般指的是CPU中的寄存器,用来暂存CPU处理所需要的指令、数据等。 vim中同样也有寄存器,使用的方式和CPU非常类似。 vim中的寄存器(register)作用和windows中的剪切板类似,不过vim中的寄存器不止一个&…...
摄影后期图像编辑软件Lightroom Classic 2023 mac中文特点介绍
Lightroom Classic 2023 mac是一款图像处理软件,是数字摄影后期制作的重要工具之一,lrc2023 mac适合数字摄影后期制作、摄影师、设计师等专业人士使用。 Lightroom Classic 2023 mac软件特点 高效的图像管理:Lightroom Classic提供了强大的图…...
一种4g扫码付费通电控制器方案
之前开发了一款扫码付款通电控制器 功能:用户扫码付款后设备通电,开始倒计时,倒计时结束后设备断电,资金到账商家的商家助手里面,腾讯会收取千分之6手续费。 产品主要应用场景 本产品主要应用于各类无人值守或者自助…...
桌面自动化工具总结
引言:产品经理提出桌面程序需要自动化的测试,避免繁琐的人肉点击。说干就干。 现有自动化工具是五花八门,我找了两个框架。 这两个框架都是基于微软的UIA 框架,链接地址 https://learn.microsoft.com/en-us/windows/win32/winauto/uiauto-providerportal?source=recommen…...
Python入门教程 | Python 常用标准库概览
Python3 标准库概览 Python 标准库非常庞大,所提供的组件涉及范围十分广泛,使用标准库我们可以让您轻松地完成各种任务。 以下是一些 Python3 标准库中的模块: os 模块:os 模块提供了许多与操作系统交互的函数,例如创…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...
