【C++】<知识点> C++11新特性

文章目录

     一、auto关键字

二、decltype关键字

三、nullptr关键字

四、智能指针

五、 无序容器(哈希表)

六、统一的初始化方法

七、成员变量默认初始值

八、范围for循环

九、右值引用与移动语义

十、lambda表达式


一、auto关键字

1. 作用:C++11引入了auto来自动推断变量类型,简化代码。在编译时,编译器会自动推断变量类型并将auto替换成实际类型。

2. 注意事项:

  • 以前版本的auto表示变量是自动存储。但这是编译器的默认规则,所以写不写都一样,使得 auto关键字非常鸡肋。
  • auto在修饰变量时需要马上初始化,否则编译器无法推断。
  • auto不能修饰函数形参。
  • auto不能修饰数组。
  • 如果表达式包含&、const和volatile,则推断时不包含这三个。若想声明为上述三种类型,则需要手动添加,如下:
int num1 = 0;
int& num2 = num1;
auto a = num2;//此处推断为int
auto& b = num2;//此处推断为int&

3. 应用场景:

  • 场景一:在使用容器迭代器时,使用auto可以简化代码。
  • 场景二:用于泛型编程,某些场景下可以少写一个泛型类型。
  • 场景三:使用auto推断lambda类型。若不使用auto,则要使用std::function。

二、decltype关键字

1. 作用:C++11增加了decltype来自动推断变量类型。

2. 基本语法:

decltype(表达式) 变量名

3. 使用示例:

3.1 基于表达式

int a = 0;
double b = 1.2;
decltype(a + b) c;//a+b的类型为double,所以c的类型也是double

3.2 基于函数返回值

int fun() {return 0;
}decltype(fun()) a;//推断为int

3.3 基于引用&、const、volatile

int a = 0;
int& num = a;
decltype(num) c = a;//此处c被推断为int&

4. decltype与auto的区别:

  • ①auto不能用于推断引用&、const、volatile,而decltype可以。
  • ②auto直接修饰变量,并且需要马上初始化;decltype需要给定一个推断的表达式,修饰的变量不需要马上初始化。

三、nullptr关键字

1. 作用:C++11增加了nullptr表示空指针。

2. 基本使用:

int* p = nullptr;
int* q = NULL;
if (p == q)cout << "相等" << endl;//会输出“相等”

3. nullptr与NULL的区别:

  • ①nullptr是C++11新特性中新增的,NULL是之前版本就有的。
  • ②nullptr可读性更高且更实用,NULL在某些编译器里被视为整数0或(void* )0。因此,对于某些函数重载来说,NULL可能会导致函数调用的二义性。

四、智能指针

C++ 新特性 | C++ 11 | 智能指针这篇博客已经写得很不错了。


 五、 无序容器(哈希表)

1. 作用:C++11提供了无序容器unordered_map。与map类似也是保存key-value,但是map的插入和查找时间复杂度为O(log n),而哈希表的插入和查找时间复杂度为O(1)

2. 基本使用:与map操作一样,如下给出示例:

unordered_map<string, int> umap;
umap.insert(make_pair("kkk", 18));
umap.insert(make_pair("xxx", 19));
umap.insert(make_pair("yyy", 17));
umap["llll"] = 28;
auto p = umap.find("kjc");
if (p != umap.end())cout << p->second << endl;//最终打印18
elsecout << "未找到" << endl;

 六、统一的初始化方法

C++11提供了变量初始化统一的方式,即在初始化时使用{},如下代码所示:

int a{ 1 };
string s{'h', 'e', 'l'};
vector<int> v{1, 2, 3};
int* p = new int[8] {4, 5, 6};//剩下的元素自动为0

七、成员变量默认初始值

类似JAVA,在类中定义成员变量时可以给一个默认的初始值,如下所示:

class A {
public:int a = 10;
};std::cout << A().a << std::endl;//打印10

八、范围for循环

1. 作用:C++11提供了范围for循环,简化了遍历代码。

2. 基本语法:

for (类型名 变量名 : 目标变量名) {...
}

3. 使用实例:

vector<int> v{ 1,2,3,4,5 };
//范围for循环:将v里的所有元素*10
for (int& i : v) {i *= 10;
}
//普通for循环:最终打印10 20 30 40 50
for (int i = 0; i < v.size(); ++i) {cout << v[i] << " ";
}

4. 注意事项:

  • ①要使用范围for循环,循环的范围必须是确定的。
  • ②要使用范围for循环,循环的对象必须能够实现++和--。

九、右值引用与移动语义

1. 左值与右值:简单来说,左值就是能取地址的,右值无法取地址。

2. 左值引用与右值引用:以前接触的都是左值引用,而右值引用是对右值的引用,如下所示:

int i = 0;
int& j = i;//左值引用
string&& s = string("hhh");//右值引用

3. 移动语义作用:“抢”别人的空间,不需要深拷贝,提升程序执行效率。对于一些临时的匿名对象,该对象执行完就会被析构,移动语义就能将它内部的空间“抢过来”,而不用再深拷贝开辟一个空间。

4. 移动语义实现前提:自定义类中需要写出移动拷贝构造函数(参数是右值引用)移动赋值运算符重载(参数是右值引用)。那么,在主程序中调用move方法就会将某个变量转变成右值,从而调用移动拷贝构造函数和移动赋值运算符重载。在它们函数内部,不用new新空间,而是直接把形参的空间赋值给自定义类的属性。注意:通过上述操作虽然无需进行深拷贝,但是传入的参数空间会发生改变。

5. 详细说明:见C++ 新特性 | C++ 11 | 移动语义与右值引用-CSDN博客。


十、lambda表达式

1. 作用:创建匿名函数。

2. 使用示例:

int num[4]{4, 2, 11, 33};
//匿名函数作为sort的排序规则
sort(num, num + 4, [](int x, int y)->bool {return x < y; });
//匿名函数作为for_each的遍历规则
for_each(num, num + 4, [](int num) {cout << num << " " << endl; });

3. 详细说明:见【C++】<总览> 基础知识-CSDN博客中的第八章的4.

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

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

相关文章

Linux shell编程学习笔记58:cat /proc/mem 获取系统内存信息

0 前言 在开展系统安全检查的过程中&#xff0c;除了收集cpu信息&#xff0c;我们还需要收集内存信息。在Linux中&#xff0c;获取内存信息的命令很多&#xff0c;这里我们着重研究 cat /proc/mem命令。 1 cat /proc/mem命令 /proc/meminfo 文件提供了有关系统内存的使用情况…

280 基于matlab的摇号系统GUI界面仿真MATLAB程序

基于matlab的摇号系统GUI界面仿真MATLAB程序&#xff0c;输入总数量及摇号需求&#xff0c;进行随机性摇号&#xff0c;并对摇取的号码进行双重随机性数据检测&#xff0c;确定是否符合要求。程序已调通&#xff0c;可直接运行。 280 GUI人机交互 摇号系统GUI界面仿真 - 小红书…

技术前沿 |【大模型InstructBLIP进行指令微调】

大模型InstructBLIP进行指令微调 一、引言二、InstructBLIP模型介绍三、指令微调训练通用视觉语言模型的应用潜力四、InstructBLIP的指令微调训练步骤五、实验结果与讨论六、结论与展望 一、引言 随着人工智能技术的快速发展&#xff0c;视觉语言模型&#xff08;Vision-Langu…

使用SourceTree切换不同的托管平台

背景&#xff1a;sourcetree一开始绑定了gitee&#xff0c;想拉取github的项目时拉取不了 原因&#xff1a;git绑定的账号&#xff08;邮箱&#xff09;、密码不一致 解决办法&#xff1a; 重新设置账号密码 在windows种可找到下面的文件夹&#xff0c;进行删除 C:\Users\US…

5.1 实体完整性

一个表只能有一个主键约束&#xff0c;且主键约束不能取空值。 通过unique约束定义唯一性&#xff0c;为了保证一个表非主键列不输入重复值&#xff0c;可在该列定义unique约束。 primary key约束与unique约束主要区别如下。 (1)一个表只能创建一个primary key约束&#xff0…

让GNSSRTK不再难【第一天】

第1讲 GNSS系统组成以及应用 北斗导航科普动画_哔哩哔哩_bilibili 1.1 GNSS系统 1.1.1 基本概念 全球卫星导航系统&#xff08;Global Navigation Satellite System, GNSS&#xff09;&#xff0c;是能在地球表面或近地空间的任何地点为用户提供全天候的三维坐标、速度以及…

STM32-电灯,仿真

目录 前言: 一. 配置vscode 二. 新创建软件工程 三. 仿真 1.新建工程想到,选择名称和路径 2.从选中的模板创建原理图 3.不创建PCB布版设计 4.选择没有固件项目 5.完成 四.源码 五. 运行效果 六. 总结 前言: 这篇主要是配置vscode和创建仿真,和点灯的完整代码,欢迎大…

在Windows上用Llama Factory微调Llama 3的基本操作

这篇博客参考了一些文章&#xff0c;例如&#xff1a;教程&#xff1a;利用LLaMA_Factory微调llama3:8b大模型_llama3模型微调保存-CSDN博客 也可以参考Llama Factory的Readme&#xff1a;GitHub - hiyouga/LLaMA-Factory: Unify Efficient Fine-Tuning of 100 LLMsUnify Effi…

美琳莱卡:创新消费模式引领新零售时代

公司成立时间与定位 美琳莱卡自创立之初,便以独特的视角和前瞻性的战略定位,立足于消费市场的变革前沿。公司成立于2024年,正值全球数字化浪潮蓬勃兴起,消费升级趋势日益明显之际。美琳莱卡敏锐地捕捉到这一时代机遇,将自身定位为创新消费模式的引领者,致力于通过线上线下高度…

攻防演练之-网络集结号

每一次的网络安全攻防演练都是各个安全厂商期待的网络安全盛会&#xff0c;因为目前的安全生态导致了只有在网络安全攻防演练期间&#xff0c;网络安全的价值才会走向台前&#xff0c;收到相关方的重视。虽然每一次都会由于各种原因不能如期举行&#xff0c;但是这一次的推迟总…

idea最新专业版安装+maven配置教程!

本教程适用于 J B 全系列产品&#xff0c;包括 Pycharm、IDEA、WebStorm、Phpstorm、Datagrip、RubyMine、CLion、AppCode 等。 &#xff08;直接复制&#xff0c;拿走不谢&#xff09; 9H1390TRAK-eyJsaWNlbnNlSWQiOiI5SDEzOTBUUkFLIiwibGljZW5zZWVOYW1lIjoi5rC45LmF5rA5rS7I…

MySQL之查询性能优化(七)

查询性能优化 排序优化 无论如何排序都是一个成本很高的操作&#xff0c;所以从性能角度考虑&#xff0c;应尽可能避免排序或者尽可能避免对大量数据进行排序。前面已经提到了&#xff0c;当不能使用索引生成排序结果的时候&#xff0c;MySQL需要自己进行排序&#xff0c;如果…

【传知代码】上下位关系自动检测方法(论文复现)

前言&#xff1a;在信息爆炸的时代&#xff0c;我们每天都沉浸在海量的数据和信息中。随着互联网技术的飞速发展&#xff0c;如何从这些信息中准确、高效地提取出有用的知识&#xff0c;成为了当下研究的热点。其中&#xff0c;上下位关系&#xff08;也称为层级关系或种属关系…

vscode 中 eslint 无效?npm init 是什么?

vscode 中 eslint 无效 我想要给一个项目添加 eslint&#xff0c;按照 eslint 官方指南操作&#xff1a; npm init eslint/configlatest自动安装了相关依赖并创建配置文件 eslint.config.mjs。 按理说&#xff0c;此刻项目应该已经配置好 eslint 了。但是我的编辑器 vscode …

《python程序语言设计》2018版第5章第36题改造4.17 石头 剪刀 布某一方超过2次就结束。

代码编写记录 2024.05.04 05.36.01version 换一个什么数代替剪子 我先建立一个函数judgement condition 石头3 剪子2 布1 如何构建一个循环进行的架构&#xff0c;是我们最需要的想法 循环以什么条件开始呢 是小于2个还是大于2个。 guess_num random.randint(1, 3) computer…

Python 和 Java 实现云计算的最终年项目

1、问题背景 目前&#xff0c;我正在进行我的最终年项目&#xff0c;计划用 Python 编写一个云计算系统&#xff0c;而云客户端将由我的团队成员使用 Java 来编写。这个云客户端将具有一个带有标签的界面&#xff0c;并提供文本编辑器、媒体播放器、几个基于 Java 的小游戏以及…

按键精灵在Win11中弹窗出现乱码并且自带的部分系统插件不能使用的解决方法

按键精灵中出现以下问题&#xff1a; 提示信息的弹窗出现乱码&#xff1a; 系统自带的部分像 plugin. 开头的插件不能使用&#xff0c;如下&#xff1a;s Plugin.Sys.GetDateTime() screenX Plugin.GetSysInfo.GetScreenResolutionX screenY Plugin.GetSysInfo.GetScreenRe…

⌈ 传知代码 ⌋ 记忆大师

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

IDEA去除代码和XML中的波浪线(黄色警告线)

通常情况下&#xff0c;IDE自带的侦测功能会帮我们提示一些错误、警告等。但这对于强迫症患者来说并不友好。以下是去除IDE代码和XML文件中的波浪线&#xff08;黄色警告线&#xff09;、拯救强迫症患者的有效方案 1、去除XML中的波浪线 2、去除代码中的波浪线 关爱强迫症患者…

归并排序!

归并排序 https://articles.zsxq.com/id_g23e5o3lg87e.html 目录 归并排序算法思想命名由来算法描述sortList函数mergeSort函数 源代码 算法思想 通过将当前乱序的数组分成两个部分&#xff0c;分别进行「递归调用」&#xff0c;利用两个指针将数据元素以此比较&#xff0c;选…