【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// 8return 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//3return 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;//运行结果//  intreturn 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
1return 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);   //在第一个位置的后面插入1000flist.insert_after(flist.begin(),100);     //在第一个位置的后面插入100flist.erase_after(flist.begin());     //删除第一个位置的后面的一个元素100flist.sort();              //排序接口for (auto e : flist){cout << e << " ";}cout << endl;return 0;
}
//运行结果:
2 3 1
1 2 3 1000

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

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

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

相关文章

深度学习体系结构——CNN, RNN, GAN, Transformers, Encoder-Decoder Architectures算法原理与应用

1. 卷积神经网络 卷积神经网络&#xff08;CNN&#xff09;是一种特别适用于处理具有网格结构的数据&#xff0c;如图像和视频的人工神经网络。可以将其视作一个由多层过滤器构成的系统&#xff0c;这些过滤器能够处理图像并从中提取出有助于进行预测的有意义特征。 设想你手…

计算机组成原理【CO】Ch2 数据的表示和应用

文章目录 大纲2.1 数制与编码2.2 运算方法和运算电路2.3 浮点数的表示和运算 【※】带标志加法器OFSFZFCF计算机怎么区分有符号数无符号数? 【※】存储排列和数据类型转换数据类型大小数据类型转换 进位计数制进制转换2的次幂 各种码的基本特性无符号整数的表示和运算带符号整…

(我的创作纪念日)[MySQL]数据库原理7——喵喵期末不挂科

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

50+ Midjourney 美食相关提示词,看了别流口水哦

Midjourney 是一个无限的创意宝藏。通过对提示词的精挑细选&#xff0c;我们就可以从这个宝藏里面挖掘无数的美食创意。有些效果令人惊叹&#xff0c;甚至无法在现实世界中复刻。本文不只是罗列 50 多个提示词&#xff0c;而是对它们进行分门别类&#xff0c;并附上图片。相信你…

ELK、ELKF企业级日志分析系统介绍

前言 随着企业级应用系统日益复杂&#xff0c;随之产生的海量日志数据。传统的日志管理和分析手段&#xff0c;难以做到高效检索、实时监控以及深度挖掘潜在价值。在此背景下&#xff0c;ELK日志分析系统应运而生。"Elastic" 是指 Elastic 公司所提供的一系列与搜索…

C++(3) —— 核心编程

一、内存区分模型 1.1 程序运行前 #include<iostream> using namespace std;// 全局变量 int g_a 10; int g_b 20;// const修饰的全局变量&#xff0c;全局常量 const int c_g_a 10; const int c_g_b 20;int main() {// 全局区// 全局变量、静态变量、常量// 创建普通…

采集某新闻网资讯网站保存PDF

网址&#xff1a;融资总额近3亿美元、药明康德押注&#xff0c;这家抗衰老明星公司有何过人之处-36氪 想要抓取文章内容&#xff0c;但是找不到啊&#xff0c;可能是文字格式的问题&#xff0c;也可能文章内容进行了加密。 在元素中查看&#xff0c;window.initialState返回的就…

【Unity+Python】如何通过Socket进行通信

1、Unity端创建名为UnityClient.cs脚本代码(客户端)&#xff1a; 注意&#xff1a;unity的规则中类&#xff0c;名和脚本文件名需要相同。 using System.Net.Sockets; using System.Text; using UnityEngine;public class UnityClient : MonoBehaviour {TcpClient client;Netw…

CSS核心样式-02-盒模型属性及扩展应用

目录 三、盒模型属性 常见盒模型区域 盒模型图 盒模型五大属性 1. 宽度 width 2. 高度 height 3. 内边距 padding 四值法 三值法 二值法 单值法 案例 4. 边框 border 按照属性值的类型划分为三个单一属性 ①线宽 border-width ②线型 border-style ③边框颜色 bo…

软考高级架构师:随机函数模型

一、AI 讲解 随机函数模型是理解各种随机过程和算法的一个重要概念&#xff0c;在软件工程、算法设计以及系统分析中有着广泛的应用。简而言之&#xff0c;随机函数模型是一种用于描述具有随机性的系统或过程的数学模型&#xff0c;它能够帮助我们预测和分析在不确定性下的系统…

基于java+springboot+vue实现的智能停车计费系统(文末源码+Lw+ppt)23-30

摘 要 随着人们生活水平的高速发展&#xff0c;智能停车计费信息管理方面在近年来呈直线上升&#xff0c;人们也了解到智能停车计费的实用性&#xff0c;因此智能停车计费的管理也逐年递增&#xff0c;智能停车计费信息的增加加大了在管理上的工作难度。为了能更好的维护智能…

MySQL基础入门上篇

MySQL基础 介绍 mysql -uroot -p -h127.0.0.1 -P3306项目设计 具备数据库一定的设计能力和操作数据的能力。 数据库设计DDL 定义 操作 显示所有数据库 show databases;创建数据库 create database db02;数据库名唯一&#xff0c;不能重复。 查询是否创建成功 加入一些…

学习基于pytorch的VGG图像分类 day5

注&#xff1a;本系列博客在于汇总CSDN的精华帖&#xff0c;类似自用笔记&#xff0c;不做学习交流&#xff0c;方便以后的复习回顾&#xff0c;博文中的引用都注明出处&#xff0c;并点赞收藏原博主. 目录 VGG的数据集处理 1.数据的分类 2.对数据集的处理 VGG的分类标签设置 …

spring boot集成logback到mysql 8

spring boot集成logback到mysql 8 依赖数据库准备创建log日志用户&#xff0c;并创建数据库执行建表sql 配置文件bugbug 1&#xff1a;Failed to instantiate type ch.qos.logback.classic.db.DBAppenderbug信息&#xff1a;解决&#xff1a; bug2: DBAppender cannot function…

设计模式-代理模式(Proxy)

1. 概念 代理模式&#xff08;Proxy Pattern&#xff09;是程序设计中的一种结构型设计模式。它为一个对象提供一个代理对象&#xff0c;并由代理对象控制对该对象的访问。 2. 原理结构图 抽象角色&#xff08;Subject&#xff09;&#xff1a;这是一个接口或抽象类&#xff0…

AIGC专栏10——EasyAnimate 一个新的类SORA文生视频模型 轻松文生视频

AIGC专栏10——EasyAnimate 一个新的类SORA文生视频模型 &#x1f4fa;轻松文生视频 学习前言源码下载地址技术原理储备&#xff08;DIT/Lora/Motion Module&#xff09;什么是Diffusion Transformer (DiT)LoraMotion Module EasyAnimate简介EasyAnimate原理界面展示快速启动云…

主干网络篇 | YOLOv8更换主干网络之ConvNext | 全新的纯卷积模型

前言:Hello大家好,我是小哥谈。2022年,Facebook AI Research和UC Berkeley一起发表了一篇文章A ConvNet for the 2020s,在文章中提出了ConvNeXt纯卷积神经网络,它对标的是2021年非常火的Swin Transformer,通过一系列实验比对,在相同的FLOPs下,ConvNeXt相比Swin Transfo…

软考系规第2章思维导图,软硬件网络和次新技术大杂烩

虽然目前系统规划与管理师的教程是否改版存在不确定性&#xff0c;但是不影响咱们先概要了解当前的教程&#xff0c;使用思维导图的方式粗读教程。 为了帮助你更好的学习系规教程&#xff0c;降低系规教程阅读门槛&#xff0c;指尖疯特发起了教程伴读活动&#xff0c;通过伴读脑…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.4 月末操作:货币折算

2.6.4 月末操作&#xff1a;货币折算 如果一个公司代码启用了多个本位币&#xff0c;如下表所示&#xff0c;则在平时记账时&#xff0c;系统会在凭证行项目中同时体现出多个本位币的金额。 图2.6.4-1 两个本位币的金额都会实时更新到科目余额中。因此&#xff0c;在月末可以直…

2024最新版守约者二级域名分发系统

主要功能 二级域名管理&#xff1a;我们的系统提供全面的二级域名管理服务&#xff0c;让您轻松管理和配置二级域名。 域名分发&#xff1a;利用我们先进的域名分发技术&#xff0c;您可以自动化地分配和管理域名&#xff0c;确保每个用户或客户都能及时获得所需的域名资源。 自…