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

【C++干货铺】C++11常用新特性 | 列表初始化 | STL中的变化

=========================================================================

个人主页点击直达:小白不是程序媛

C++系列专栏:C++干货铺

代码仓库:Gitee

=========================================================================

目录

C++11简介

列表初始化

std::initializer_list

std::initializer_list使用场景

decltype关键字

STL中的一些变化

新容器

array

forward_list

容器中的一些新方法


C++11简介

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了
C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞
进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。
从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于
C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中
约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,
C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更
强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,所以我们要作为一个
重点去学习。


列表初始化

在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。例如:

struct Point
{int _x;int _y;
};
int main()
{int array1[] = { 1, 2, 3, 4, 5 };int array2[5] = { 0 };Point p = { 1, 2 };return 0;
}

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

int main()
{int i = 0;int j = { 1 };int k{ -1 };cout << i << " " << j << " " << k;int arr1[] = { 1,2,3,4,5 };int arr2[5] = { 0 };int arr3[]{ 1,2,3,4,5 };//添加到new表达式中int* pa = new int[4] {1, 2, 3, 4};return 0;
}

创建对象时也可以使用列表初始化方式调用构造函数初始化

//自定义类型的列表初始化
class Date
{
public:Date(int year,int month,int day):_year(year),_month(month),_day(day){cout << "Date(int year,int month,int day)" << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1{ 2024,1,18 };//初始化一个对象,拷贝构造Date d2 = { 2024,1,19 };return 0;
}

注:这里的列表初始化的是直接调用构造函数,而下面的赋值重载看起来和列表初始化差不多,其实两者天差地别;赋值重载是先使用右边的数据构造生成一个临时对象,在赋值重载,而初始化列表是直接调用构造函数。存在类型转化。

std::initializer_list

std::initializer_list文档介绍

功能:可以接受任意多个相同类型的参数

std::initializer_list使用场景

  • std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加
  • std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=的参数,这样就可以用大括号赋值。
  • 总结:我们使用初始化列表初始化STL中的容器时,就会将列表生成initializer_list;然后initializer_list作为容器构造函数的参数进行初始化。

decltype关键字

关键字decltype将变量的类型声明为表达式指定的类型

和typeid().name()、auto有很大的区别,typeid().name()推演出变量的类型,decltype是将变量的类型转化为字符串可以打印出来。

int main()
{int i;double j;vector<decltype(i* j)> v1;decltype(i * j) z = 10;cout << typeid(z).name() << endl;cout << z << endl;return 0;
}

 


STL中的一些变化

新容器

下面中圈起来的就是C++11中添加的新容器,最后的unordered_map和unordered_set不同于使用红黑树的map和set是使用hash结构实现;有关hash的内容和知识会在后面的文章中给大家介绍。

array

  • array数组是固定大小的序列容器:它们包含特定数量的元素,这些元素以严格的线性顺序排序。
  • 说白了也是一个数组,只不过和普通的数组比较其越界检查比较严格。

forward_list

是一个单链表,和list的区别在于只支持单向迭代器;并且只支持头插和头删。

容器中的一些新方法

  • 如果我们再细细去看会发现基本每个容器中都增加了一些C++11的方法,但是其实很多都是用得比较少的。
  • 比如提供了cbegin和cend方法返回const迭代器等等,但是实际意义不大,因为begin和end也是可以返回const迭代器的。
  • 容器中一些还有一些关于移动构造移动和移动赋值的一些内容需要有右值引用的知识铺垫,我会在下一篇文章中完整的给大家介绍。

今天给大家分享介绍了C++中常用特性的一部分,由于篇幅问题会在下篇文章中介绍右值引用等其他问题;如果觉得文章还不错的话,可以三连支持一下,个人主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是我前进的动力! 

相关文章:

【C++干货铺】C++11常用新特性 | 列表初始化 | STL中的变化

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 C11简介 列表初始化 std::initializer_list std::initializer_list使用场景 decltype关键字 STL中的一些变化 新容器 array forward_list 容器中的一些新…...

k8s的对外服务---ingress

service的作用体现在两个方面&#xff1a; 集群内部&#xff1a;不断追踪pod的变化。他会更新endpoint中的pod对象&#xff0c;基于pod的IP地址不断变化的一种服务发现机制。 集群外部&#xff1a;类似负载均衡器&#xff0c;把流量IP端口&#xff0c;不涉及转发url(http、htt…...

element-ui的el-upload组件实现上传拖拽排序图片顺序(sortablejs)

<template><!-- 省略其他配置 --><el-upload ref"upload" :file-list.sync"fileList"></el-upload></template><script>import Sortable from sortablejs;export default {data() {return {fileList: []};},mounted()…...

【PS】PS设计图欣赏、学习、借鉴

【PS】PS设计图欣赏、学习、借鉴 bilibili萌新PS学习计划&#xff1a;PS教程全套零基础教学视频&#xff08;全套81节全新版本&#xff09;...

游戏云化好吗?游戏云化会带来什么?

随着云计算技术的飞速发展&#xff0c;游戏云化成为游戏产业中备受关注的话题。这一新兴技术给玩家和游戏行业带来了全新的可能性。本文将深入探讨游戏云化的概念、优势以及可能带来的影响。 1、什么是游戏云化&#xff1f; 游戏云化是指将游戏的各个环节&#xff0c;包括游戏…...

制造业企业数字化转型难点剖析及解决之法

导语 全球正在由工业经济向数字经济转型过渡&#xff0c;制造业正在且并将长期处于数字化转型发展阶段&#xff0c;并沿着数字化、网络化、智能化阶段不断跃升。但如何找准数字化转型的切入点&#xff0c;以低耗能、低成本、高效率的方式加快制造业转型升级的步伐&#xff0c;仍…...

golang 服务端遇到strict-origin-when-cross-origin,解决跨域整理

golang 服务端遇到strict-origin-when-cross-origin&#xff0c;解决跨域整理 以下内容由chatgpt中文网 动态生成,助力开发找我 代码汇总&#xff1a; func Cors() gin.HandlerFunc {return func(c *gin.Context) {method : c.Request.Methodorigin : c.Request.Header.Get(…...

分布式事务Seata实战-AT模式(注册中心为Eureka)

大致记录Seata的AT模式下创建项目过程中需要注意的点和可能遇到的问题。 本项目是以官网的给的示例&#xff08;即下图&#xff09;进行创建的&#xff0c;以Eureka为注册中心。 官网&#xff1a;Seata AT 模式 | Apache Seata™ 官方代码示例&#xff1a; 快速启动 | Apac…...

windows vscode jsoncpp cmake c++ 构建项目

jsoncpp的编译和使用推荐文章&#xff1a;jsoncpp的编译和使用 | 爱编程的大丙 (subingwen.cn)https://www.subingwen.cn/cpp/jsoncpp/从这个链接下载jsoncpp-master&#xff1a;https://github.com/open-source-parsers/jsoncpp 可以把这个文件夹名字改成jsoncpp&#xff0c;…...

按照一定规则批量修改文件夹内文件的名称

#一个小朋友问我的问题&#xff0c;写好后&#xff0c;就想着分享出来# #目前只想到这一个普通的方法&#xff0c;应该还有更巧妙的方法&#xff0c;读者可以自己思考# 需求&#xff1a;给定文件夹40001&#xff0c;要求将该文件夹内的图片按照40001_00000001,40002_00000002…...

Git项目分支管理规范

一、分支管理 创建项目时&#xff0c;会针对不同环境创建两个常设分支(也可以算主分支&#xff0c;永久不会删除) master&#xff1a;生产环境的稳定分支&#xff0c;生产环境基于该分支构建。仅用来发布新版本&#xff0c;除了从release测试分支或 hotfix-*Bug修复分支进行m…...

ycsb压测mongodb

下载解压 https://github.com/brianfrankcooper/YCSB/releases/download/0.17.0/ycsb-mongodb-binding-0.17.0.tar.gz tar -zxvf ycsb-mongodb-binding-0.17.0.tar.gzycsb提前已经在workload文件夹下准备好了几个压测场景分别对应workload[a:f] workloads/workloada 样例 …...

【zip密码】Zip压缩包删除密码方法,有哪些?

大家都知道压缩包可以进行加密&#xff0c;但是当我们不需要加密压缩包的时候&#xff0c;该如何删除zip压缩包密码呢&#xff1f;那么zip压缩包密码取消都有什么方法呢&#xff1f;今天将方法总结分享给大家。 最原始的方法&#xff0c;就是通过解压文件&#xff0c;将解压出…...

代码随想录算法训练营day24 || 回溯法原理讲解,77.组合

回溯方法的理论原理与定义 回溯算法是潜藏于递归过程之中一种操作&#xff0c;与递归操作相辅相成&#xff1b;初步理解&#xff0c;有递归必有回溯&#xff0c;使用回溯最好的方式是递归&#xff0c;至于其他的方式有待探索。回溯是一种多重循环的变体&#xff0c;其本质就是…...

RPA与通知机器人的完美结合

写在前面 在现代快节奏的工作环境中&#xff0c;我们经常会面临多个任务同时进行的情况&#xff0c;你还在为时间不够用、忙碌而惆怅吗&#xff1f;你还在为时刻盯着电脑流程而烦恼吗&#xff1f;你还在为及时收不到自己的自动化任务进度而焦躁吗&#xff1f;别担心&#xff0…...

openssl3.2 - 官方demo学习 - signature - rsa_pss_direct.c

文章目录 openssl3.2 - 官方demo学习 - signature - rsa_pss_direct.c概述笔记END openssl3.2 - 官方demo学习 - signature - rsa_pss_direct.c 概述 用RSA私钥签名 d2i_PrivateKey_ex()可以从内存载入私钥数据, 得到私钥EVP_PKEY* 从私钥产生ctx, 对ctx进行签名初始化, 设置…...

高效批量剪辑技巧:一键按指定时长精准分割视频的方法,轻松制作视频

随着社交媒体和数字内容的快速发展&#xff0c;视频制作的需求也日益增长。在制作视频时&#xff0c;我们经常需要将长视频分割成多个片段&#xff0c;或者将多个片段连接在一起。为了提高效率&#xff0c;我们可以使用一些高效的批量剪辑技巧&#xff0c;一键按指定时长精准分…...

Android基础知识

1. Activity的生命周期 onCreate&#xff1a;Activity在启动时会被创建&#xff0c;后面一般不会在调用该方法&#xff08;除非例外情况&#xff0c;将Activity回收&#xff0c;例如内存不足&#xff09;&#xff1b;onStart&#xff1a;Activity启动时&#xff0c;会调用该方…...

linux下把动态库变成静态库

1.用nm命令获取动态库中的所有符号列表&#xff0c;假如动态库的文件为lib.so nm -gD lib.so > lib.txt 将把符号列表输出到名为lib.txt的文本文件中 2.创建个新的静态库文件&#xff0c;使用ar命令可以创建一个空的静态库文件 ar -rcs lib.a 3.将动态库中的每个符号提…...

基于STM32单片机设计的智能水温控制系统

一、前言 1.1 项目介绍 【1】项目功能介绍 随着科技的快速发展和智能化生活的普及,人们对生活品质的需求日益提高,对家用电器自动化与智能化控制的要求也越来越高。在家庭用水场景中,热水器、浴缸以及智能水暖系统的温控需求尤为突出。传统水温控制系统往往功能单一、操作…...

PIL——图像读取、裁剪、保存操作

一、读取 Image.open(figure_path)二、裁剪 image.crop()image.crop() : 从图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数&#xff0c;各元素为&#xff08;x1, y1, x2, y2&#xff09;&#xff0c;即 左上角坐标、右下角坐标。坐标系统的原点&#xff08…...

Windows 下 QT开发环境的搭建:

下载QT:Index of /archive/qt/5.14 下载Cmake :CMake - Upgrade Your Software Build System (1)QT在windows,C, 打包exe&#xff1a; step1:window上安装QT软件&#xff1a; Windows下的QT系统开发环境搭建_qt windows-CSDN博客. step2:新建一个界面工程&#xff1a; (1)打…...

深度学习中Numpy的一些注意点(多维数组;数据类型转换、数组扁平化、np.where()、np.argmax()、图像拼接、生成同shape的图片)

文章目录 1多维数组压缩维度扩充维度 2numpy类型转换深度学习常见的float32类型。 3数组扁平化4np.where()的用法5np.argmax()6图像拼接7生成同shape的图片&#xff0c;指定数据类型 1多维数组 a.shape(3,2);既数组h3&#xff0c;w2 a.shape(2,3,2);这里第一个2表示axis0维度上…...

(2023版)斯坦福CS231n学习笔记:DL与CV教程 (56) | 卷积神经网络

前言 &#x1f4da; 笔记专栏&#xff1a;斯坦福CS231N&#xff1a;面向视觉识别的卷积神经网络&#xff08;23&#xff09;&#x1f517; 课程链接&#xff1a;https://www.bilibili.com/video/BV1xV411R7i5&#x1f4bb; CS231n: 深度学习计算机视觉&#xff08;2017&#xf…...

表单验证 ---- 在Vue2中使用ElementUI进行表单验证

目录 前言 给表单绑定对应属性 在data中定义数据对象和表单的定义规则 与数据对象双向绑定 对整个表单进行验证 前言 在做项目时&#xff0c;对于表单进行验证是我们必不可少的 例如 搭建一个基本的登录界面 <div class"form"><h1>登录</h1>&…...

HarmonyOS 转场动画 ForEach控制

本文 我们继续说组件的专场特效 上文 HarmonyOS 转场动画 我们通过if控制了转场效果 本文 我们通过 ForEach 控制它的加载和删除 这时候就有人会好奇 ForEach 怎么控制删除呢&#xff1f; 很简单 循环次数不同 例如 第一次 10个 第二次 5个 那么后面的五个就相当于删除啦 我们…...

2024--Django平台开发-订单项目管理(十四)

day14 订单管理系统 1.关于登录 1.1 UI美化 页面美化&#xff0c;用BootStrap 自定义BooStrapForm类实现。 class BootStrapForm:exclude_filed_list []def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# {title:对象,"percent":对象}fo…...

Docker 安装 CentOS

Docker 安装 CentOS CentOS&#xff08;Community Enterprise Operating System&#xff09;是 Linux 发行版之一&#xff0c;它是来自于 Red Hat Enterprise Linux(RHEL) 依照开放源代码规定发布的源代码所编译而成。由于出自同样的源代码&#xff0c;因此有些要求高度稳定性…...

方案解决:5G基站节能及数字化管理

截至2023年10月&#xff0c;我国5G基站总数达321.5万个&#xff0c;占全国通信基站总数的28.1%。然而&#xff0c;随着5G基站数量的快速增长&#xff0c;基站的能耗问题也逐渐日益凸显&#xff0c;基站的用电给运营商带来了巨大的电费开支压力&#xff0c;降低5G基站的能耗成为…...

JavaScript深浅拷贝的几种方式

文章目录 前言深拷贝1. JSON.parse(JSON.strigify(Str))2. lodash.deepclone3. structuredClone 浅拷贝总结 前言 深浅拷贝主要是针对于引用类型而言的 深拷贝 1. JSON.parse(JSON.strigify(Str)) 序列化的作用是存储(对象本身存储的只是一个地址映射&#xff0c;如果断电&a…...