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

【C++练级之路】【Lv.21】C++11——列表初始化和声明



快乐的流畅:个人主页


个人专栏:《算法神殿》《数据结构世界》《进击的C++》

远方有一堆篝火,在为久候之人燃烧!

文章目录

  • 引言
  • 一、列表初始化
    • 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,进行迭代器区间构造

  1. 构造initializer_list的过程:在常量区找到列表中的值,用两个指针start和finish指向头部和尾部的下一位(类似于vector的内部原理)
  2. 每个容器都添加了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——列表初始化和声明

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、列表初始化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 < …...

【机器学习与大模型】驱动下的应用图像识别与处理

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

24李林跌落神坛,880还刷吗?还是换1000、900、660?

“李林今年跌落神坛了&#xff01;” “全是固定题型没新题&#xff0c;结果今年考的全是新题。” 880是“老真题的神”&#xff0c; 遇到24年&#xff0c;冷门考点多&#xff0c;计算量又大&#xff0c;就不灵了。 但“老真题”&#xff0c;还是得刷。就像往年真题是要刷的…...

数据库漫谈-sybase

sybase就是“system”加“database”&#xff0c;代表着信息系统的底层。Sybase公司很早就推出了关系数据库产品&#xff08;1987年5月推出的Sybase SQLServer1.0&#xff09;。Sybase也是第一个提出Client/Server 体系结构的思想&#xff0c;并率先在Sybase SQLServer 中实现。…...

Springboot开发 -- Postman 调试类型详解

引言 在 Spring Boot 应用开发过程中&#xff0c;接口测试是必不可少的一环。Postman 作为一款强大的 API 开发和测试工具&#xff0c;可以帮助开发者轻松构建、测试和管理 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…...

垃圾回收机制及算法

文章目录 概要对象存活判断引用计数算法可达性分析算法对象是否存活各种引用 垃圾收集算法分代收集理论复制算法标记清除算法标记-整理算法 概要 垃圾收集&#xff08;Garbage Collection&#xff0c; 下文简称GC&#xff09;&#xff0c;其优缺点如下&#xff1a; 优点&#…...

蓝桥杯-暴力搜索BFS+DFS

九九乘法表挂毯 问题描述&#xff1a; 在一个古老的城堡里&#xff0c;一位名为 Alex 的少年发现了一幅巨大的九九乘法表挂毯。挂毯被划分成了9x9的方格&#xff0c;每个方格上写着相应的乘积。Alex 想象自己站在数值为1的方格上&#xff0c;他的目标是到达数值为 81 的方格。…...

巧用count与count()

在C#中&#xff0c;talentInnoPfChains.Count() 和 talentInnoPfChains.Count 的性能差异主要取决于 talentInnoPfChains 的类型。这里有两种可能的情况&#xff1a; 如果 talentInnoPfChains 是一个实现了 ICollection<T> 接口的集合&#xff08;如 List<T>, Hash…...

MongoDB 覆盖索引查询:提升性能的完整指南

MongoDB 覆盖索引查询是一种优化数据库查询性能的技术&#xff0c;它通过创建适当的索引&#xff0c;使查询可以直接从索引中获取所需的数据&#xff0c;而无需访问实际的文档数据。这种方式可以减少磁盘 I/O 和内存消耗&#xff0c;提高查询性能。 基本语法 在 MongoDB 中&a…...

ECMAScript详解

ECMAScript&#xff08;简称ES&#xff09;是一种由Ecma国际&#xff08;前身为欧洲计算机制造商协会&#xff0c;European Computer Manufacturers Association&#xff09;通过ECMA-262标准化的脚本程序设计语言。以下是对ECMAScript的详细说明&#xff1a; 1. 定义与起源 …...

如何在Windows 10上对硬盘进行碎片整理?这里提供步骤

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

科学高效备考AMC8和AMC10竞赛,吃透2000-2024年1850道真题和解析

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

SQL——SELECT相关的题目

目录 197、上升的温度 577、员工奖金 586、订单最多的客户 596、超过5名学生的课 610、判断三角形 620、有趣的电影 181、超过经理收入的员工 1179、重新格式化部门表&#xff08;行转列&#xff09; 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编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-0…...

常用激活函数学习

常用激活函数及其应用 ReLU (Rectified Linear Unit) 公式: f ( x ) max ⁡ ( 0 , x ) f(x) \max(0, x) f(x)max(0,x)理解: 当输入值为正时&#xff0c;输出等于输入值&#xff1b;否则输出为0。ReLU函数简单且计算效率高&#xff0c;能有效缓解梯度消失问题&#xff0c;促进…...

html中被忽略的简单标签

1&#xff1a; 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拖放组件技术探索

一、引言 随着前端技术的不断发展&#xff0c;拖放&#xff08;Drag-and-Drop&#xff09;功能已经成为许多Web应用不可或缺的一部分。Vue.js作为现代前端框架的佼佼者&#xff0c;为开发者提供了丰富的生态系统和强大的工具链。Vue.Draggable作为基于Sortable.js的Vue拖放组件…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...