【C++11(一)之入门基础)】

文章目录

  • C++简介
  • 统一的列表初始化
      • {}初始化
  • std::initializer_list
      • std::initializer_list是什么类型:
      • std::initializer_list使用场景:
  • 声明
      • auto
      • decltype
      • nullptr
  • STL中一些变化

C++简介

在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++11增加的语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以本节课程主要讲解实际中比较实用的语法。
https://en.cppreference.com/w/cpp/11
小故事
1998年是C++标准委员会成立的第一年,本来计划以后每5年视实际需要更新一次标准,C++国际标准委员会在研究C++ 03的下一个版本的时候,一开始计划是2007年发布,所以最初这个标准叫C++ 07。但是到06年的时候,官方觉得2007年肯定完不成C++ 07,而且官方觉得2008年可能也完不成。最后干脆叫C++ 0x。x的意思是不知道到底能在07还是08还是09年完成。结果2010年的时候也没完成,最后在2011年终于完成了C++标准。所以最终定名为C++11。

统一的列表初始化

{}初始化

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

struct Point
{int x;int y;
};
int main()
{int array[] = { 1, 2, 3, 4, 5 };int array[5] = { 0 };Point p = { 1, 2 };return 0;
}

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

int main()
{//C++11 内置类型支持列表初始化int a = 0;//不推荐int b = { 1 };int c{ 1 };	//可以省略=//C++11 列表初始化也可适用于new表达式中int* pa = new int[5] {0};return 0;
}

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

class Date
{
public: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, 3, 23);//C++11//构造 + 拷贝构造-》优化-》直接构造//多参数的隐式类型转换// C++11支持的列表初始化,这里会调用构造函数初始化Date d2 = { 2024, 3, 23 };Date d3{ 2023, 3, 23 };//单参数string s1("1111");//构造string s2 = "1111";	//单参数隐式类型转换//new表达式也可列表初始化Date* darr1 = new Date[3]{ d1, d2, d3 };Date* darr2 = new Date[3]{ {2023, 3, 4}, {2024, 3, 23}, {2024, 3, 24} };
}

std::initializer_list

std::initializer_list是什么类型:

int main()
{auto il1 = { 1, 2,3,4, 5 };cout << typeid(il1).name() << endl;//class std::initializer_list<int>
}

具体查看一下:
在这里插入图片描述
在这里插入图片描述

可以发现initializer_list其实就是一个模板类,且成员函数支持begin,end说明其支持迭代器,也就支持范围for,还有size接口提供其大小。

std::initializer_list使用场景:

std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加
std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=的参数,这样就可以用大括号赋值。

int main()
{initializer_list<int>il1 = { 1, 2, 3,4,5 };initializer_list<int>il2 = { 1, 2, 3,4,5 ,6,7,8,9,10};cout << sizeof(il1) << endl;	//16cout << sizeof(il2) << endl;	//16
}

从代码结果大小来看,其实initializer_list底层就是有两个begin,end两个指针,指向这n个相同类型参数,编译器会将其存到静态区的一个数组空间里面的首和尾。

C++11支持一系列容器进行列表初始化,那正如上面所说,自定义类型可以单参数或者多参数隐式类型转换,也就是列表初始化去调用构造函数,这里容器列表初始化有n个相同类型的参数,怎么办呢?

int main()
{//C++11 容器也支持列表初始化vector<int> v1 = { 1, 2, 3, 4, 5, 6 };vector<int> v2;v2 = { 1, 2, 3 };for (auto e : v1){cout << e << " ";}pair<string, string> kv1("sort", "排序");pair<string, string> kv2("string", "字符串");map<string, string> dict1 = { kv1, kv2 };	//写法一map<string, string> dict2 = { {"sort", "排序"}, {"string", "字符串"} };	//写法二for (auto& kv : dict2){cout << kv.first << ":" << kv.second << endl;}pair<const char*, const char*> kv3("sort", "排序");pair<const string, string> kv4(kv3);return 0;
}

解释一:
vector容器可以进行列表初始化,原因是支持了initializer_list作为参数的构造函数,vector容器对象可以使用列表初始化进行赋值,也是增加了initializer_list作为参数的operator=函数。
在这里插入图片描述
在这里插入图片描述
解释二:

map<string, string> dict2 = { {"sort", "排序"}, {"string", "字符串"} };	

对于每个pair使用列表初始化还能理解,map使用列表初始化也能理解,无非就是调用了C++11新增加的initializer_list作为参数的构造函数嘛为什么对于pair列表初始化时,pair是pair<const char*, const char*>类型,怎么到了initializer_list这里,就变成了initializer_list<pair<const string, string>类型呢?
原因如下:

template<class T1, class T2>
struct pair
{//pari<const char*, const char*> kv3pair(const T1& t1, cosnt T2& t2):first(t1),second(t2){}//pair<const string, string>kv4(kv3)//新玩法,新场景,拷贝构造实现模板template<class U, class V>	pair(pair<U, V>& kv){first = kv.first;	second = kv.second;}
private:T1 first;T2 second;
};

通过增加pair的模板拷贝构造函数就解决了。

声明

auto

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

//切记auto 不能用于函数的返回值
auto func2()
{return 2;
}
int fun()
{return 1;
}
int main()
{int i = 10;auto p = &i;auto pf = fun;cout << typeid(pf).name() << endl;cout << typeid(p).name() << endl;map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };//map<string, string>::iterator it = dict.begin();auto it = dict.begin();cout << typeid(it).name() << endl;return 0;
}

切记:auto不要用于函数返回值,尽管C++20之后支持

decltype

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

int func()
{return 10;
}
int main()
{const int x = 1;const int* p1 = &x;decltype(p1) p2 = nullptr;cout << typeid(p2).name() << endl;//使用场景auto ret = func();//假设需要用vector存func的数据vector<decltype(ret)> v;return 0;
}

作用就是取出原生类型

nullptr

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

#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif

STL中一些变化

新容器

一、array容器
array容器本质就是一个静态数组,即固定大小的数组。

array容器有两个模板参数,第一个模板参数代表的是存储的类型,第二个模板参数是一个非类型模板参数,代表的是数组中可存储元素的个数。比如:

int main()
{array<int, 10> a1;   //定义一个可存储10个int类型元素的array容器array<double, 5> a2; //定义一个可存储5个double类型元素的array容器return 0;
}

array容器与普通数组对比:

  • array容器与普通数组一样,支持通过[]访问指定下标的元素,也支持使用范围for遍历数组元素,并且创建后数组的大小也不可改变。
  • array容器与普通数组不同之处就是,array容器用一个类对数组进行了封装,并且在访问array容器中的元素时会进行越界检查。用[]访问元素时采用断言检查,调用at成员函数访问元素时采用抛异常检查。
  • 而对于普通数组来说,一般只有对数组进行写操作时才会检查越界,如果只是越界进行读操作可能并不会报错。

但array容器与其他容器不同的是,array容器的对象是创建在栈上的,因此array容器不适合定义太大的数组。

二、forward_list容器
forward_list容器本质就是一个单链表。

forward_list很少使用,原因如下:

  1. forward_list只支持头插头删,不支持尾插尾删,因为单链表在进行尾插尾删时需要先找尾,时间复杂度为O(N)。
  2. forward_list提供的插入函数叫做insert_after,也就是在指定元素的后面插入一个元素,而不像其他容器是在指定元素的前面插入一个元素,因为单链表如果要在指定元素的前面插入元素,还要遍历链表找到该元素的前一个元素,时间复杂度为O(N)。
  3. forward_list提供的删除函数叫做erase_after,也就是删除指定元素后面的一个元素,因为单链表如果要删除指定元素,还需要还要遍历链表找到指定元素的前一个元素,时间复杂度为O(N)。

因此一般情况下要用链表我们还是选择使用list容器。

三、unordered_map和unordered_set容器
unordered_map和unordered_set容器底层采用的都是哈希表。
C++11提供了各种内置类型与string之间相互转换的函数,比如to_string、stoi、stol、stod等函数。

容器中的一些新方法

  1. 提供了一个以initializer_list作为参数的构造函数和赋值函数,用于支持列表初始化。
  2. 提供了cbegin和cend方法,用于返回const迭代器。无关痛痒
  3. 提供了emplace系列方法,并在容器原有插入方法的基础上重载了一个右值引用版本的插入函数,用于提高向容器中插入元素的效率。
  4. push_xxx , insert ,增加了右值引用版本,意义重大。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据新视界--大数据大厂之MySQL 数据库课程设计:数据安全深度剖析与未来展望

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

一种误差较小的轮廓面积计算算法

1.背景 基于微分思想的轮廓面积计算方法之一是将多边形轮廓边与X轴会Y轴进行围合&#xff0c;形成一个个梯形&#xff0c;每个梯形的面积有符号&#xff0c;累计求和即得到多边形轮廓的面积。详见博主之前的文章&#xff0c; 记录导致计算轮廓面积出错的一个坑点-CSDN博客文章…

项目拆解:短视频冷门赛道—ai绘画+温馨小屋,引流变现全攻略

在这个快节奏的时代&#xff0c;工作、学习、家庭的重担仿佛三座大山&#xff0c;让人喘不过气&#xff0c;心情时常跌入谷底。就像蜗牛遇到威胁会缩进壳里&#xff0c;我们也会在疲惫和忧虑时&#xff0c;渴望一个属于自己的温暖小窝&#xff0c;来安放疲惫的心灵。而自媒体平…

Flink 1.14.* Flink窗口创建和窗口计算源码

解析Flink如何创建的窗口&#xff0c;和以聚合函数为例&#xff0c;窗口如何计算聚合函数 一、构建不同窗口的build类1、全局窗口2、创建按键分流后的窗口 二、在使用窗口处理数据流时&#xff0c;不同窗口创建的都是窗口算子WindowOperator1、聚合函数实现2、创建全局窗口(入参…

SpringFrameWork学习笔记

本笔记基于【尚硅谷新版SSM框架全套视频教程&#xff0c;Spring6SpringBoot3最新SSM企业级开发】https://www.bilibili.com/video/BV1AP411s7D7?vd_sourcea91dafe0f846ad7bd19625e392cf76d8 总结 资料获取网址&#xff1a;https://www.wolai.com/v5Kuct5ZtPeVBk4NBUGBWF 技术…

Java项目: 基于SpringBoot+mysql房产销售系统 (含源码+数据库+开题报告+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmysql房产销售系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能齐…

Halcon基于灰度值的模板匹配

Halcon基于灰度值的模板匹配 基于灰度值的模板匹配是最经典的模板匹配算法&#xff0c;也是最早提出来的模板匹配算法。这种算法的根本思想是&#xff0c;计算模板图像与检测图像之间的像素灰度差值的绝对值总和&#xff08;SAD方法&#xff09;或者平方差总和&#xff08;SSD…

ico格式怎么转换?5个软件让你轻松转换文件格式

ico格式怎么转换&#xff1f;5个软件让你轻松转换文件格式 ICO格式是常用于网站图标和应用程序图标的文件格式&#xff0c;虽然它很常见&#xff0c;但并非所有图像编辑软件都支持直接保存为ICO格式。如果你需要将其他格式的图片&#xff08;如PNG、JPG等&#xff09;转换为IC…

读书学习笔记入门 # Datawhale X 李宏毅苹果书 AI夏令营

文章目录 学习目标&#xff1a;学习内容&#xff1a;Task 1 通过案例了解机器学习机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;和深度学习&#xff08;Deep Learning&#xff0c;DL&#xff09;的基本概念什么是回归&#xff08;regression&#xff09;什么…

深入解析Linux轻量级进程:线程的概念、原理、优缺点及其与进程的关系与区别

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f4da;Linux线程&#x1f4d5;什么是线程*可以使用多进程去并发的执行一个进程的代码&#xff0c;那为什么要由线程呢&#x…

基于CloudflareSpeedTest项目实现git clone加速

1.网络测速 「自选优选 IP」测试 Cloudflare CDN 延迟和速度&#xff0c;获取最快 IP 更多内容参考项目&#xff1a;https://github.com/XIU2/CloudflareSpeedTest 国外很多网站都在使用 Cloudflare CDN&#xff0c;但分配给中国内地访客的 IP 并不友好&#xff08;延迟高、丢…

Pixelmator Pro for Mac 专业图像处理软件【媲美PS的修图软件】

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件…

【STM32+HAL库】---- 通用定时器输入捕获PWM信号

硬件开发板&#xff1a;STM32G0B1RET6 软件平台&#xff1a;cubemaxkeilVScode1 新建cubemax工程 1.1 配置系统时钟RCC 1.2 配置定时器 1.2.1 配置输入捕获 选择通用定时器TIM2-Channel 1为输入捕获引脚&#xff0c;对应IO口是PA0,时钟源选择内部时钟源Internal clock,工作模…

Unity实战案例 2D小游戏HappyGlass(模拟水珠)

本案例素材和教程都来自Siki学院&#xff0c;十分感谢教程中的老师 本文仅作学习笔记分享交流&#xff0c;不作任何商业用途 预制体 在这个小案例中&#xff0c;水可以做成圆形但是带碰撞体&#xff0c;碰撞体比图形小一圈&#xff0c;顺便加上Trail renderer组件 材质 将碰撞…

Win11 / Win10 系统极化工具,降低游戏延迟效果明显

Win11 / Win10 系统优化工具,降低游戏延迟效果明显 Windows 系统优化就是精简系统一些功能组件、对一些系统功能进行设置等&#xff0c;这样可以减少不必要的硬件资源占用。 全面的系统优化功能外&#xff0c;据不少网友表示通过优化后 CS GO 游戏降低输入延迟效果明显。 免费…

沃飞长空联合极氪亮相2024世界动力电池大会

9月1日至2日&#xff0c;2024世界动力电池大会在四川宜宾举办&#xff0c;沃飞长空与同属吉利控股集团旗下的新时代豪华科技品牌极氪汽车一同亮相。 现场&#xff0c;双方携手展出了AE200电动垂直起降航空器、极氪009光辉版、极氪001&#xff0c;以及极氪能源、金砖电池、威睿…

开源 AI 智能名片 O2O 商城小程序在营销中的应用

摘要&#xff1a;本文探讨了开源 AI 智能名片 O2O 商城小程序在营销中的应用&#xff0c;重点分析了喜好原则、互惠互利和高度认可三个方面对小程序推广和用户忠诚度提升的重要性。通过融入这些原则&#xff0c;开源 AI 智能名片 O2O 商城小程序能够更好地满足用户需求&#xf…

HTML静态网页成品作业(HTML+CSS)——动漫大耳朵图图网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

VUE2.0 elementUI el-input-number 数据更新,视图不更新——基础积累

今天遇到一个问题&#xff0c;是关于el-input-number组件的&#xff0c;发现数据明明已经更改了&#xff0c;但是页面上组件输入框中还是之前的值。 比如上方输入框中&#xff0c;我输入120.5&#xff0c;就会出现下面的诡异现象 回显此值是120.779&#xff0c;但是页面上输入…

协同开发工具Git

网上对于Git的使用方法介绍的很多&#xff0c;在日常工作中&#xff0c;Git是团队开发必不可少的工具之一&#xff0c;我想为一些刚使用Git的小伙伴们介绍一下常遇到的小问题。 1&#xff1a;拼写错误。这应该是每个初学者都会犯得错误&#xff0c;当出现这种错误还是比较好排…