【C++学习】C++11新特性(第一节)

在这里插入图片描述

文章目录

  • 一.文章前言
  • 二.C++11新特性
    • 一.统一的列表初始化
    • 二.std::initializer_list
    • 三.声明
    • 四.decltype关键字
    • 五.nullptr
    • 六.新增加容器---静态数组array、forward_list以及unordered系列
      • 6.1unordered_map与unoredered_set
      • 6.2array
      • 6.3 forward_list(单链表)

一.文章前言

C++11文档链接:link

2011年之前,C++98(C++03)称为C++11之前的最新C++标准名称。相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,C++11的新特性将会分为三个文章进行讲解,这是第一节。

二.C++11新特性

一.统一的列表初始化

  • 在C++98中,标准允许使用花括号{ }对数组或者结构体元素进行统一的列表初始值设定。比如下面的代码:
struct person
{
	int _id;
    string _name;
};
int main()
{
	person p = { 21314341,"张三"};
	int arr[] = { 1,2,3,4 };

	return 0;
}
  • C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。例如下面的代码:
struct person
{
	int _id;
	string _name;
};
int main()
{
	//int _a = 1;
	int _a{ 1 };  //用1初始化_a变量
	double _d{ 1.0 };

	person s{ 12345,"李四" };
	int arr[]{ 1,2,3,4 };

	return 0;
}
  • C++11中列表初始化也可以适用于new表达式中
int main()
{
	int* p = new int[4] {1, 2, 3, 4};

	return 0;
}
  • 创建对象时也可以使用列表初始化方式调用构造函数初始化
struct Date
{
	Date(int year,int month,int day)
		:_year(year)
		,_month(month)
		,_day(day)
	{}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	//C++98支持的调用构造函数初始化
	Date d1(2024, 4, 6);

	//C++11,这里也会调用构造函数
	Date d{ 2024,4,6 };
	Date d ={ 2024,4,6 };

	map<string, string> m{ {"string","字符串"},{"world","世界"} };
	set<int> s{ 1,2,5,3 };

	return 0;
}

二.std::initializer_list

initializer_list 文档:链接: link

int main()
{
	auto il = { 10, 20, 30 }; 
	cout << typeid(il).name() << endl;

	//运行结果:class std::initializer_list<int>
	return 0;
}
int main()
{
	auto il1 = { 10, 20, 30 };
	initializer_list<int> il2 = { 10,20,30 };
	cout << sizeof(il1) << endl;
	cout << sizeof(il2) << endl;
	
	//运行结果
	// 8
	// 8
	return 0;
}

根据文档以及上面的代码可以理解为:
initializer_list 类似于一个容器,但是它不存储数据,{10,20,30}这个数组被放到了常量区,然后initializer_list里面有两个指针,一个指向数组起始位置,一个指向数组的最后。
代码调试验证:
在这里插入图片描述
initializer_list有相关接口:
以代码的形式讲解:

int main()
{
	auto il1 = { 10, 20, 30 };
	initializer_list<int> il2 = { 10,20,30 };

	cout << &il2 << endl;
	cout << il2.begin() << endl;   //返回指向的数组的第一个元素的指针
	cout << il2.end() << endl;     //返回指向的数组的最后一个元素的下一个元素的指针
	cout << il2.size() << endl;     //求指向的数组的大小
	
	//运行结果:
	//0053FBC4  
	//0053FBB0
	//0053FBBC
	//3
	return 0;
}

从上面的运行结果来看, il2.begin() 返回的地址是被指向数组的起始位置,( {10,20,30}是才能放在常量区的,取不到地址的,这里取的地址是被拷贝到栈上的数组的地址)
std::initializer_list使用场景:

std::initializer_list一般是作为构造函数参数,C++11对STL中的不少容器就增加std::initializer_list作为参数的构造函数(如下图),例如vector,map,list,set等这样初始化容器对象就更方便了。也可以作为operator=的参数,这样就可以用大括号赋值。
在这里插入图片描述
在这里插入图片描述

例如以下代码:

int main()
{
	vector<int> v{ 1,2,3,4,5 };   //大括号进行初始化
	v = { 8,13,1 };               //大括号赋值

	//下面详解这一个怎么初始化的
	map<string, string> dict = {{"string", "字符串"}};

	return 0;
}
//下面详解详解{"string", "字符串"}怎么初始化dict的
	map<string, string> dict = {{"string", "字符串"}};

	//{"string", "字符串"}-->pair<const char*,const char*>
	//但是map里面存储的键值对类型为pair<const key,T>
	//那么pair<const char*, const char* >是怎么转换为pair<const key,T>的呢?
	//这里是借助的pair的一个拷贝构造,pair的拷贝构造利用了模板
	//pair的拷贝构造:template<class U, class V> 
	//              pair (constpair<U,V>& pr);
	//先利用pair的拷贝构造将pair<const char*, const char* >转换为pair<const string,string>
	//然后再利用initializer_list 去构造初始化dict

三.声明

c++11提供了多种简化声明的方式,尤其是在使用模板时。

  1. auto
    在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto就没什么价值了。C++11中废弃auto原来的用法,将其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。

例子:

int main()
{
	int _a = 10;
	auto p = &_a;
	cout << typeid(p).name() << endl;  
	//运行结果:
	//int *

	map<string, int> mapcount;
	string arr[] = { "apple","string","right","left","apple","right","right","left" };
	for (auto& e : arr)   //自动识别e的类型为pair<string,int>
	{
		mapcount[e]++;
	}

	//map<string, int>::iterator it = mapcount.begin();
	auto it = mapcount.begin();     
	while (it != mapcount.end())
	{
		cout << it->first << ":" << it->second << endl;
		++it;
	}

	return 0;
}

注意:不建议用auto去做返回值,因为有弊端,例如下面这种场景:

auto func()
{
	int ret = 10;

	return ret;
}
auto func2()
{
	auto ret = func();

	return ret;
}

auto func3()
{
	auto ret = func2();

	return ret;
}
auto func1()
{
	auto ret = func3();

	return ret;
}
/当我们想要知道func1中ret的类型时,还要去看func3的返回值,func3的返回值也是auto,又得去看func2的,如果一个项里面函数特别多时,则就会很麻烦。

四.decltype关键字

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

举个例子:

int main()
{
	int _a = 10;
	decltype(_a) y;    //用 _a 声明的类型为 y 的类型
	cout << typeid(y).name() << endl;
	//运行结果
	//  int

	return 0;
}

使用场景:需要定义一个变量(对象等),但是需要根据另一个变量或则对象的类型来定义时,可以使用关键字decltype。
例如:

template<class T1,class T2>
void func(const T1 x, const T2 y)
{
	decltype(x * y) ret;
	ret = x * y;

	cout << ret << endl;
}

五.nullptr

由于C++中NULL被定义成字面量0,这样就可能回带来一些问题,因为0既能指针常量,又能表示整形常量。所以出于清晰和安全的角度考虑,C++11中新增了nullptr,用于表示空指针。

六.新增加容器—静态数组array、forward_list以及unordered系列

如图:圈出来的四个容器为新增
在这里插入图片描述

6.1unordered_map与unoredered_set

unordered_map与unoredered_set的使用与相关接口以及模拟实现在上篇文章已经讲过,这里就不做详解(文章链接link)

6.2array

array文档链接link

在这里插入图片描述

array是一个静态数组,大小为N,数据存储类型为T。
array的相关接口:

函数名作用
size返回数组中元素的个数
empty判断是否为空
front返回第一个元素
[ ]下标随机访问
back返回最后一个元素
data返回指向第一个元素的指针
at(size_t i)返回数组中下标为i的元素的引用

演示代码:

C++11 array(静态数组)
int main()
{
	array<int, 10> arr;
	vector<int> v = { 1,2,3,4,5,6,7,8,9 };
	for (size_t i = 0; i < v.size(); i++)
	{
		arr.at(i) = v[i];
	}
	for (auto e : arr)
	{
		cout << e << " ";
	}
	cout << endl;
	cout << arr.size() << endl;
	cout << arr.back() << endl;
	cout << arr.front() << endl;

	int* p = arr.data();
	cout << *p << endl;

//运行结果:
1 2 3 4 5 6 7 8 9 -858993460
10
-858993460
1
1
	return 0;
}

当数组没有初始化完时,剩余的没有被处理,为随机值。
array所支持的接口,vector基本上都能支持,并且vector容器使用比array更方便,接口也更多,所以容器array的出现,感觉多此一举。

6.3 forward_list(单链表)

forward_list 文档链接link

文档总结:forward_list是一个单链表,节点里面只有一个指向下一个节点的指针和一个存储数据的变量,因为它不方便找前一个,所以不支持当前位置插入与删除,只支持在当前位置的下一个节点后面插入,删除当前位置的下一个节点,但是支持头插头删(效率高),不支持尾删(因为要遍历找尾,效率低)。

代码演示:

//forward_list(单链表)
int main()
{
	forward_list<int> flist;
	flist.push_front(1);
	flist.push_front(3);   //头插
	flist.push_front(2);
	for (auto e : flist)
	{
		cout << e << " ";
	}
	cout << endl;
	flist.insert_after(flist.begin(), 1000);   //在第一个位置的后面插入1000
	flist.insert_after(flist.begin(),100);     //在第一个位置的后面插入100
	flist.erase_after(flist.begin());     //删除第一个位置的后面的一个元素100
	flist.sort();              //排序接口
	for (auto e : flist)
	{
		cout << e << " ";
	}
	cout << endl;

	return 0;
}
//运行结果:
2 3 1
1 2 3 1000

🐵🐵🐵🐵🐵🐵🐵🐵🐵🐵🐵🐵🐵🐵
本章节完~ 后续的关于C++11的新特性在下篇

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

上海亚商投顾:创业板指低开低走 低空经济概念股尾盘拉升

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日集体调整&#xff0c;沪指午后跌超1%&#xff0c;深成指、创业板指盘中跌超2%&#xff0c;尾盘跌…

计算机视觉——基于深度学习UNet实现的复杂背景文档二值化算法实现与模型训练

1. 引言 阈值分割可以被视为一个分类问题&#xff0c;通常涉及两个类别&#xff0c;这也是为什么阈值分割也被称为二值化。对于文档图像&#xff0c;我们期望阈值算法能够正确地将墨水分类为黑色&#xff0c;将纸张分类为白色&#xff0c;从而得到二值化图像。对于数字灰度图像…

腾讯云人脸服务开通详解:快速部署,畅享智能体验

请注意&#xff0c;在使用人脸识别服务时&#xff0c;需要确保遵守相关的法律法规和政策规定&#xff0c;保护用户的合法权益&#xff0c;并依法收集、使用、存储用户信息。此外&#xff0c;腾讯云每个月会提供一定次数的人脸识别调用机会&#xff0c;对于一般的小系统登录来说…

头歌-机器学习 第11次实验 softmax回归

第1关&#xff1a;softmax回归原理 任务描述 本关任务&#xff1a;使用Python实现softmax函数。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.softmax回归原理&#xff0c;2.softmax函数。 softmax回归原理 与逻辑回归一样&#xff0c;softmax回归同样…

(三)、PTP时间精确协议如何工作的【Part1】

1、精确时钟需要校准 一个自由运行的时钟&#xff0c;本身每次的频率也不是绝对一致的&#xff08;每次频率都会有细微的差异&#xff09;&#xff0c;相位也是未知的。时间从来不是理想的&#xff0c;想到达到一个相对理想的准确时间&#xff0c;必须对时间进行调整&#xff0…

Electron 桌面端应用的使用 ---前端开发

Electron是什么&#xff1f; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。 入门…

2024.4.8Morris中序遍历(线索二叉树)学习

这次博主在学习完知识点和代码之后&#xff0c;准备对这个知识重新进行整理总结。站在一个初学者的角度来看待这个知识点&#xff0c;在他人的讲解基础上加一点点自己的理解&#xff0c;并记录下来。以加深自己的理解&#xff0c;并且希望能够帮助到你。博主是一个初学者&#…

马云最新发声:AI时代刚刚到来,一切才刚开始,我们正当其时!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

原码一位乘法

王道考研ppt总结&#xff1a; 个人理解&#xff1a; 原码一位乘法&#xff1a; 结果符号的确定&#xff1a;符号位异或&#xff0c;很好理解 数值位绝对值相乘 小数的乘法&#xff1a; 小学乘法的规则是&#xff1a;乘数的每一位和被乘数进行相乘&#xff0c;然后作为数积&…

labelImg将图像标签显示到界面

打开View的显示类别 但是颜色不够清晰&#xff0c;我想自己定制 我的象棋红色和黑色两种。并且把字体方法一些。 可以看到 color self.select_line_color if self.selected else self.line_color参考&#xff1a;https://blog.csdn.net/qq_41082953/article/details/10330225…

如何使用 ArcGIS Pro 制作热力图

热力图是一种用颜色表示数据密度的地图&#xff0c;通常用来显示空间分布数据的热度或密度&#xff0c;我们可以通过 ArcGIS Pro 来制作热力图&#xff0c;这里为大家介绍一下制作的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的POI数…

Gitlab全量迁移

Gitlab全量迁移 一、背景1.前提条件 一、背景 公司研发使用的Gitlab由于服务器下架需要迁移到新的Gitlab服务器上。Gitlab官方推荐了先备份然后再恢复的方法。个人采用官方的另外一种方法&#xff0c;就写这篇文章给需要的小伙伴参考。 源Gitlab: http://old.mygitlab.com #地…

vue2创建项目的两种方式,配置路由vue-router,引入element-ui

提示&#xff1a;vue2依赖node版本8.0以上 文章目录 前言一、创建项目基于vue-cli二、创建项目基于vue/cli三、对吧两种创建方式四、安装Element ui并引入五、配置路由跳转四、效果五、参考文档总结 前言 使用vue/cli脚手架vue create创建 使用vue-cli脚手架vue init webpack创…

leetCode第十题 : 正则表达式匹配 动态规划【10/1000 python】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作http://t.csdnimg.cn/Q59WX 作者专栏每日更新&#xff1a; LeetCode…

软考120-上午题-【软件工程】-软件开发模型02

一、演化模型 软件类似于其他复杂的系统&#xff0c;会随着时间的推移而演化。在开发过程中&#xff0c;常常会面临以下情形&#xff1a;商业和产品需求经常发生变化&#xff0c;直接导致最终产品难以实现&#xff1b;严格的交付时间使得开发团队不可能圆满地完成软件产品&…

Docker安装nacos教程

目录 1.首先拉取nacos镜像2.启动容器&#xff0c;3.查看容器id4.复制容器内的 /home/nacos目录下的logs,data,conf目录到容器外&#xff08;docker cp 后的容器id可以缩略写前几位&#xff09;5.进入上一步操作的conf目录&#xff0c;修改目录下的application.properties的文件…

FORM的引入与使用

FORM的引入与使用 【0】引入 ​ 表单&#xff08;Form&#xff09;是网页中用于收集用户输入数据的一种交互元素。通过表单&#xff0c;用户可以输入文本、选择选项、上传文件等操作。表单通常由一个或多个输入字段&#xff08;Input Field&#xff09;组成&#xff0c;每个字…

【重磅推荐】2024七大零售行业线下开店超全指南大全共452份

如需下载完整PPTX可编辑源文件&#xff0c;请前往星球获取&#xff1a;https://t.zsxq.com/19F4dDDrv 联华快客便利店的加盟手册.docx 好德便利店加盟手册.docx 超市&便利店守则:商品退换货管理.docx 赠品管理制度.doc 选址必看.doc 新人续签考核作业.doc 物流箱管理制度.d…

第04章 计算机常用通信指标和术语视频课程

4.1 本章目标 掌握bit、Byte、KB、MB、GB、TB概念和换算关系掌握波特率、比特率、误码率的概念掌握信道、基带信号、频带信号概念了解多路复用、频分多路复用、时分多路复用了解同步传输、异步传输概念 4.2 bit、Byte、KB、MB、GB、TB概念和换算关系 4.2.1 概念与换算 4.2.2…

SinoDB备份恢复工具之dbexport/dbimport

dbexport和 dbimport是两个简单的备份恢复实用程序&#xff0c;无需任何提前配置即可运行。这两个实用程序可以在不同平台的SinoDB数据库服务器之间迁移数据&#xff0c;可以使用它们备份和还原小型数据库。 1. dbexport命令语法 dbexport以文本格式导出数据库中所有对象的模式…