【C++练级之路】【Lv.21】C++11——列表初始化和声明
文章目录
- 引言
- 一、列表初始化
- 1.1 内置类型
- 1.2 结构体或类
- 1.3 容器
- 二、声明
- 2.1 auto
- 2.2 decltype
- 2.3 nullptr
- 三、STL的变化
- 3.1 新增容器
- 3.2 新增initializer_list构造
- 3.3 新增移动构造、移动赋值和移动插入
- 3.4 其他
引言
关于C++11的auto、nullptr和范围for的知识,在之前已经提到过,这里不再赘述,有需要的请移步这篇博客【C++练级之路】【Lv.1】C++,启动!(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for,nullptr)
一、列表初始化
C++11更新后,一切皆可用列表初始化。列表初始化,又称统一初始化,具体使用{}进行初始化。
列表初始化,沿袭C语言对于内置类型和结构体的初始化上,进行了统一形式的扩展。
1.1 内置类型
void test()
{//单一变量int i = 0;int j = { 0 };int k{ 0 };//数组int arr1[] = { 1,2,3 };int arr2[5]{ 0 };//动态开辟int* ptr1 = new int[5] {0};
}
虽然内置类型(如 int, double 等)通常不需要列表初始化,但列表初始化仍然允许。列表初始化的一个特点,就是可以去除等号“=”。
1.2 结构体或类
struct Point
{int _x, _y;
};class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}
private:int _year, _month, _day;
};void test()
{//结构体Point p1 = { 3,5 };Point p2{ 4,6 };//类Date d1(2024, 4, 10);Date d2 = { 2024,5,1 };Date d3{ 2024,6,1 };//动态开辟Date* ptr2 = new Date[3]{ d1,d2,d3 };Date* ptr3 = new Date[3]{ {2024,1,1},{2024,2,2},{2024,3,3} };
}
对于类的列表初始化,可以理解为隐式类型转换:构造临时对象->拷贝构造->编译器优化为直接构造。
1.3 容器
void test()
{vector<int> v1 = { 1,2,3 };vector<int> v2 = { 1,2,3,4,5 };map<string, string> dict = { {"排序","sort"},{"逆序","reverse"} };
}
对于容器的列表初始化,可不是之前的类型转换,因为此时初始化的列表是可以变长的,而之前的多参数构造是固定长度的。
那么,此时应该怎么理解容器的列表初始化呢?其实,这里涉及了STL库中的initializer_list类。
void test()
{auto il = { 1,2,3,4,5 };cout << typeid(il).name() << endl;initializer_list<int>::iterator it = il.begin();while (it != il.end()){cout << *it << " ";++it;}cout << endl;for (auto e : il){cout << e << " ";}cout << endl;
}
由上述代码可知,让编译器自动推导列表类型,便是class std::initializer_list< int >。同样的,initializer_list类也有自己的迭代器,可以用迭代器进行遍历和修改。
那么,每次容器的列表初始化过程可以理解为:将右侧构造为initializer_list ->遍历initializer_list,进行迭代器区间构造。
- 构造initializer_list的过程:在常量区找到列表中的值,用两个指针start和finish指向头部和尾部的下一位(类似于vector的内部原理)
- 每个容器都添加了initializer_list的构造函数,调用对应的构造函数,运用迭代器区间进行容器构造
ps:容器既有initializer_list的构造,也有initializer_list的赋值
二、声明
C++11提供了多种简化声明的方式,尤其是在使用模板时。
2.1 auto
2.2 decltype
关键字decltype可将变量的类型声明为表达式指定的类型。
void test()
{int x = 1;double y = 2.0;decltype(x) k;auto ret = x * y;vector<decltype(ret)> v;
}
decltype最大的作用,便是用来定义模板参数。因为auto没办法作为模板参数,所以decltype正好弥补了这方面的缺陷。
2.3 nullptr
三、STL的变化
3.1 新增容器
C++11更新了四个容器,分别是array,forward_list,unordered_set,unordered_map。其中unordered_set,unordered_map,我们已经深入学习和模拟实现过了。
那么,关于array和forward_list,其实带来的提升较小,实际中较少用到。
- array:array是一个固定大小的容器,它在编译时就知道自己的大小,这使得它在性能上通常优于vector,因为它不需要在运行时进行动态内存分配和大小调整。
- forward_list:forward_list是一个单向链表,它只包含指向下一个元素的指针,没有指向前一个元素的指针。这使得它在内存使用上比list(双向链表)更高效。
3.2 新增initializer_list构造
这点在先前列表初始化已经提到过,这是一个非常有用的提升与变化,initializer_list的引入使得 C++ 的初始化语法更加简洁、直观和灵活,提高了代码的可读性和可维护性。
3.3 新增移动构造、移动赋值和移动插入
这是非常重要的提升,可以大大提高效率。具体内容要等讲到右值引用和移动语义时会详细讲解。
3.4 其他
还比如提供了cbegin和cend方法返回const迭代器等等,但是实际意义不大,因为begin和end也是可以返回const迭代器的,这些都是属于锦上添花的操作。
相关文章:

【C++练级之路】【Lv.21】C++11——列表初始化和声明
快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、列表初始化1.1 内置类型1.2 结构体或类1.3 容器 二、声明2.1 auto2.2 decltype2.3 nullptr 三、STL的…...

输入一串字符串,前中后都有*号,去掉字符串中间和后面的*号,保留前面的*号和字母
#include <stdio.h> void fun(char* a) {//***df**fr*fg***int i 0, j 0,n0,m0;char* p;p a;while (p[i] ! \0){i;//i是一共的字符的个数}printf("%d\n",i);while (a[n] *){n;//计算字母前的*的个数}printf("%d\n", n);m n;for (j n; j < …...

【机器学习与大模型】驱动下的应用图像识别与处理
摘要: 本文深入探讨了机器学习在图像识别与处理领域的应用,特别是在大模型的推动下所取得的巨大进展。详细阐述了图像识别与处理的基本原理、关键技术,以及机器学习算法和大模型如何提升其性能和准确性。通过实际案例分析了其在多个领域的广泛…...

24李林跌落神坛,880还刷吗?还是换1000、900、660?
“李林今年跌落神坛了!” “全是固定题型没新题,结果今年考的全是新题。” 880是“老真题的神”, 遇到24年,冷门考点多,计算量又大,就不灵了。 但“老真题”,还是得刷。就像往年真题是要刷的…...
数据库漫谈-sybase
sybase就是“system”加“database”,代表着信息系统的底层。Sybase公司很早就推出了关系数据库产品(1987年5月推出的Sybase SQLServer1.0)。Sybase也是第一个提出Client/Server 体系结构的思想,并率先在Sybase SQLServer 中实现。…...

Springboot开发 -- Postman 调试类型详解
引言 在 Spring Boot 应用开发过程中,接口测试是必不可少的一环。Postman 作为一款强大的 API 开发和测试工具,可以帮助开发者轻松构建、测试和管理 HTTP 请求。本文将为大家介绍如何在 Spring Boot 开发中使用 Postman 进行接口测试。 一、准备工作 安…...
Windows 后台启动jar并且输出日志到特定日志
Windows 后台启动jar并且输出日志到特定日志 javaw -Dfile.encodingutf-8 -jar xxx.jar >log.log 2>&1 &日志输出以年月日格式显示 javaw -Dfile.encodingutf-8 -jar xxx.jar >log_%DATE:~0,4%-%DATE:~5,2%-%DATE:~8,2%_%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2…...

垃圾回收机制及算法
文章目录 概要对象存活判断引用计数算法可达性分析算法对象是否存活各种引用 垃圾收集算法分代收集理论复制算法标记清除算法标记-整理算法 概要 垃圾收集(Garbage Collection, 下文简称GC),其优缺点如下: 优点&#…...
蓝桥杯-暴力搜索BFS+DFS
九九乘法表挂毯 问题描述: 在一个古老的城堡里,一位名为 Alex 的少年发现了一幅巨大的九九乘法表挂毯。挂毯被划分成了9x9的方格,每个方格上写着相应的乘积。Alex 想象自己站在数值为1的方格上,他的目标是到达数值为 81 的方格。…...
巧用count与count()
在C#中,talentInnoPfChains.Count() 和 talentInnoPfChains.Count 的性能差异主要取决于 talentInnoPfChains 的类型。这里有两种可能的情况: 如果 talentInnoPfChains 是一个实现了 ICollection<T> 接口的集合(如 List<T>, Hash…...
MongoDB 覆盖索引查询:提升性能的完整指南
MongoDB 覆盖索引查询是一种优化数据库查询性能的技术,它通过创建适当的索引,使查询可以直接从索引中获取所需的数据,而无需访问实际的文档数据。这种方式可以减少磁盘 I/O 和内存消耗,提高查询性能。 基本语法 在 MongoDB 中&a…...
ECMAScript详解
ECMAScript(简称ES)是一种由Ecma国际(前身为欧洲计算机制造商协会,European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。以下是对ECMAScript的详细说明: 1. 定义与起源 …...

如何在Windows 10上对硬盘进行碎片整理?这里提供步骤
随着时间的推移,由于文件系统中的碎片,硬盘驱动器可能会开始以较低的效率运行。为了加快驱动器的速度,你可以使用内置工具在Windows 10中对其进行碎片整理和优化。方法如下。 什么是碎片整理 随着时间的推移,组成文件的数据块&a…...

科学高效备考AMC8和AMC10竞赛,吃透2000-2024年1850道真题和解析
多做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一,通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。 今天我们继续…...

SQL——SELECT相关的题目
目录 197、上升的温度 577、员工奖金 586、订单最多的客户 596、超过5名学生的课 610、判断三角形 620、有趣的电影 181、超过经理收入的员工 1179、重新格式化部门表(行转列) 1280、学生参加各科测试的次数 1068、产品销售分析I 1075、项目员工I …...

etcd集群部署
1.etcd介绍 1.1 什么是etcd etcd的官方定义如下: A distributed, reliable key-value store for the most critical data of distributed systemetcd是一个Go语言编写的分布式、高可用的一致性键值存储系统,用于提供可靠的分布式键值(key value)存储、配置共享和服务发现等…...

VBA_MF系列技术资料1-615
MF系列VBA技术资料1-615 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-0…...
常用激活函数学习
常用激活函数及其应用 ReLU (Rectified Linear Unit) 公式: f ( x ) max ( 0 , x ) f(x) \max(0, x) f(x)max(0,x)理解: 当输入值为正时,输出等于输入值;否则输出为0。ReLU函数简单且计算效率高,能有效缓解梯度消失问题,促进…...

html中被忽略的简单标签
1: alt的作用是在图片不能显示时的提示信息 <img src"https://img.xunfei.cn/mall/dev/ifly-mall-vip- service/business/vip/common/202404071019208761.jp" alt"提示信息" width"100px" height"100px" /> 2&#…...

Vue.Draggable:强大的Vue拖放组件技术探索
一、引言 随着前端技术的不断发展,拖放(Drag-and-Drop)功能已经成为许多Web应用不可或缺的一部分。Vue.js作为现代前端框架的佼佼者,为开发者提供了丰富的生态系统和强大的工具链。Vue.Draggable作为基于Sortable.js的Vue拖放组件…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...