一起来看看,C++11标准,那些超实用的新特性有哪些?

news2024/11/25 6:39:11

C++11标准是 ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++ 的简称,也称为C++0x。它由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C++标准委员会(ISO/IEC JTC1/SC22/WG21)于2011年8月12日公布,并于2011年9月正式出版。

C++11标准对C++98标准做了重大的修正和改进。C++11标准引入了许多新特性,主要包括以下几个方面:

01 智能指针:

C++11引入了智能指针,用于自动管理动态分配的内存。智能指针主要有三种类型:std::unique_ptr(独占智能指针)、std::shared_ptr(共享智能指针或引用计数智能指针)和std::weak_ptr(观察者智能指针)。这些智能指针在超出作用域时会自动释放内存,从而避免了内存泄漏和悬挂指针的问题。

#include <memory>

// 自定义类
class MyClass;

// 创建一个std::shared_ptr智能指针对象。
std::shared_ptr<MyClass> pMyClass = std::make_shared<MyClass>();

02 线程库:

C++11引入了线程库,用于支持多线程编程。线程库提供了多种类和函数,包括std::thread(线程类)、std::mutex(互斥类)、std::condition_variable(条件变量类)等,用于创建和管理线程、同步线程以及等待线程完成等操作。

03 随机数生成器:

C++11引入了随机数生成器,用于生成各种类型的随机数。随机数生成器位于头文件中,主要包括std::random_device、std::mt19937和各种分布函数。下面看一个生成随机数的例子:

#include <random>

// 生成随机数例子。
std::random_device rd;
std::mt19937 gen(rd());
int iValue = gen();    // 生成随机数

04 基于范围for循环:

C++11引入了基于范围for循环(range-based for loop),用于遍历数组、容器等数据结构。范围for循环的语法如下:

// 语法:
for (auto element : container) {
    // 循环体
}
// 其中,container是要遍历的容器,element是容器中的每个元素。

// 例子:
#include <vector>
std::vector<int> vecDatas;
for (int v : vecDatas)
{
    // 循环体
}

05 lambda表达式:

C++11引入了lambda表达式,用于定义匿名函数。lambda表达式可以捕获其所在作用域中的变量,并使用这些变量在lambda函数体中定义操作。以下是一个lambda表达式的使用例子:

#include <vector>
#include <algorithm>

// 创建一个存储int的动态数组vector。
std::vector<int> vecValues{22,33,11};

// 利用lambda表达式对vector降序排序。
std::sort(vecValues.begin(), vecValues.end(), [](int a, int b)
    {
        return a > b;
    }
);

06 右值引用和移动语义:

C++11引入了右值引用和移动语义,用于优化资源管理。右值引用和移动语义可以避免资源泄漏和拷贝操作,提高程序的性能和安全性。

07 类型推导:

C++11引入了类型推导(type deduction),使用关键字auto来自动推导变量的类型。这可以提高代码的可读性和可维护性。

#include <map>
#include <string>

std::map<int, std::string> mapD​atas;
// ...

// 以下auto使用自动推导特性。
auto iter = mapD​atas.find(1);
if (mapD​atas.end() != iter)
{
    // ...
}

08 追踪返回类型:

C++11引入了追踪返回类型(trailing return type),允许在函数声明中指定返回类型,而不是在函数名之前。这可以提高代码的可读性和可维护性。

09 nullptr:

C++11引入了新的空指针常量nullptr,用于表示空指针。nullptr比NULL更加安全,因为它是一个常量表达式,不能被隐式转换为整数类型。记得以后不要再使用NULL了。

// 自定义类
class MyClass;

// 类指针初始nullptr
MyClass* pMyClass = nullptr;

10 长整数类型:

C++11引入了新的长整数类型long long(64位长整数),它能够表示比int和long类型更大的整数。

11 静态断言:

C++11引入了静态断言static_assert,用于在编译时检查条件是否为真。如果条件为假,则编译器会生成错误信息。

12 外部模板:

C++11引入了外部模板(extern template),允许在头文件中声明模板,并在其他文件中定义它们。这可以提高编译速度并减少重复代码。

13 列表初始化:

C++11引入了列表初始化语法(list initialization),允许使用大括号{}来初始化变量和容器。这种语法比传统的赋值语法更加清晰和安全。来看几个例子:

#include <map>
std::map<int, float> mapDatas;

// 传统方式插入数据
mapDatas.insert(std::pair<int, float>(1, 1.25));
// 或者下面这种
mapDatas.insert(std::make_pair(1, 1.25));

// C++11方式插入数据
mapDatas.insert( { 1, 1.25 } );

// 传统的初始化
double dValue = 1.25;
// C++11支持这种初始化
double dValue {1.25};

14 新容器:

C++11引入了一些新的容器,包括std::unordered_map(无序关联容器,基于哈希表实现)、std::unordered_set(无序集合,基于哈希表实现)、std::forward_list(单向链表)等。这些容器提供了更加灵活和高效的数据结构选择。

15 新算法:

C++11引入了一些新的算法,如std::copy_if、std::move_if等,用于执行特定的操作。

16 并行算法:

C++11开始支持并行算法,可以利用多核处理器进行计算加速。一些标准算法如sort,、find等已经支持并行版本。

C++11标准是C++编程语言的重要里程碑之一,为开发者提供了更强大和灵活的工具,以应对现代软件开发中的各种挑战。这里只列出一些相对实用的C++11标准,更多标准特性与描述,请查看国际标准化组织(ISO)官网介绍。

-【End】-

#想了解更多精彩内容,关注下方公众号,还有示例源码、开发工具免费下载。

喜欢本文章,记得点赞、分享、关注哦~

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

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

相关文章

基于华为MRS3.2.0实时Flink消费Kafka落盘至HDFS的Hive外部表的调度方案

文章目录 1 Kafka1.1 Kerberos安全模式的认证与环境准备1.2 创建一个测试主题1.3 消费主题的接收测试 2 Flink1.1 Kerberos安全模式的认证与环境准备1.2 Flink任务的开发 3 HDFS与Hive3.1 Shell脚本的编写思路3.2 脚本测试方法 4 DolphinScheduler 该需求为实时接收对手Topic&a…

四个简单的bat脚本

Windows11 最大劝退点就是这个右键菜单&#xff0c;复制粘贴都变成一点点的小图标&#xff0c;最气人的是点击底部的显示更多选项才能展示全部功能。让许多本来点一次就能完成的操作变成两次。其实使用一个小命令就能修改回win10版本的菜单。四个简单的bat脚本&#xff0c;能完…

Object.prototype.toString.call个人理解

文章目录 这段代码的常见用处参考文献&#xff1a; 拆分理解1、Object.prototype.toString小问题参考文献&#xff1a; 2、call函数的作用参考文献 3、继续深入一些&#xff08;这部分内容是个人理解&#xff0c;没有明确文献支撑&#xff09; 这段代码的常见用处 Object.prot…

这可能是最全面的计算机组成原理面试八股文了

第一章 计算机系统概述 “较简单&#xff0c;不做过多赘述&#xff0c;后面会详细学到” 第一节 计算机系统层次结构 1.计算机系统的基本组成&#xff1a;硬件软件 2.计算机硬件的基本组成&#xff1a;运算器存储器控制器输入设备输出设备 3.系统软件和应用软件 系统软件…

.NET国产化改造探索(六)、银河麒麟操作系统中安装多个.NET版本

随着时代的发展以及近年来信创工作和…废话就不多说了&#xff0c;这个系列就是为.NET遇到国产化需求的一个闭坑系列。接下来&#xff0c;看操作。 上一篇文章介绍了如何在银河麒麟操作系统上&#xff0c;使用Nginx.NET程序实现自启动。本文介绍下如何在一个环境中&#xff0c;…

explain工具优化mysql需要达到什么级别?

explain工具优化mysql需要达到什么级别&#xff1f; 一、explain工具是什么&#xff1f;二、explain查询后各字段的含义三、explain查询后type字段有哪些类型&#xff1f;四、type类型需要优化到哪个阶段&#xff1f; 一、explain工具是什么&#xff1f; explain是什么&#x…

macOS 14 Sonoma(苹果电脑系统) pkg完整安装包14.2.1正式版

macOS 14 Sonoma(苹果电脑系统) pkg完整安装包14.2.1正式版 游戏模式 Game mode是macOS Sonoma独有的Mac新游戏功能&#xff0c;在 macOS 14 中启用游戏模式后&#xff0c;Mac 会优先考虑运行游戏的CPU和GPU功能&#xff0c;不仅全面提高了游戏的流畅、稳定的帧率&#xff0c;…

Mybatis原理 - 标签解析

很多开源框架之所以能够流行起来&#xff0c;是因为它们解决了领域内的一些通用问题。但在实际使用这些开源框架的时候&#xff0c;我们都是要解决通用问题中的一个特例问题&#xff0c;所以这时我们就需要使用一种方式来控制开源框架的行为&#xff0c;这就是开源框架提供各种…

Python高级列表操作:性能优化、多线程与数据处理全解析

Python高级列表操作&#xff1a;性能优化、多线程与数据处理全解析 引言Python列表的高级特性列表推导式与生成器表达式列表操作的高级技巧列表与函数式编程列表在数据处理中的应用性能优化与内存管理Python列表与多线程/异步编程结语 引言 在现代软件开发中&#xff0c;选择恰…

【JavaEE Spring】SpringBoot 日志

SpringBoot 日志 1. 日志概述2. 日志使用2.1 打印⽇志2.1.1 在程序中得到⽇志对象2.1.2 使⽤⽇志对象打印⽇志 2.2 ⽇志框架介绍2.2.1 ⻔⾯模式(外观模式)2.2.2 SLF4J 框架介绍 2.3 ⽇志格式的说明2.4 ⽇志级别2.4.1 ⽇志级别的分类2.4.2 ⽇志级别的使⽤ 2.5 ⽇志配置2.5.1 配置…

MySQL---单表查询综合练习

创建emp表 CREATE TABLE emp( empno INT(4) NOT NULL COMMENT 员工编号, ename VARCHAR(10) COMMENT 员工名字, job VARCHAR(10) COMMENT 职位, mgr INT(4) COMMENT 上司, hiredate DATE COMMENT 入职时间, sal INT(7) COMMENT 基本工资, comm INT(7) COMMENT 补贴, deptno INT…

C语言练习day8

变种水仙花 变种水仙花_牛客题霸_牛客网 题目&#xff1a; 思路&#xff1a;我们拿到题目的第一步可以先看一看题目给的例子&#xff0c;1461这个数被从中间拆成了两部分&#xff1a;1和461&#xff0c;14和61&#xff0c;146和1&#xff0c;不知道看到这大家有没有觉得很熟…

前端框架学习 Vue (1) 概念,常用指令

Vue是什么 概念: Vue是一个用于 构建用户界面 的 渐进式 框架 1.构建用户界面:基于数据动态渲染页面 2.渐进式:循序渐进的学习(学一点就能用一点) (1)Vue核心包开发 场景:局部模块改造 (2)Vue核心包&Vue插件 工程化开发 场景:整站开发 3.框架:一套完整的项目…

遇到Access violation at address xxx in module ‘LoadDXF.dll‘.的解决方法

今天在设计PCB的时候&#xff0c;需要导入一个AutoCAD生成的DWG文件&#xff0c;结果导入出错&#xff0c;之前从来没有遇到过。也不清楚原因。错误的内容&#xff0c;如标题所示&#xff1a;Access violation at address xxx in module LoadDXF.dll. 对于我们既搞编程又设计…

PaddleDetection学习1——使用Paddle-Lite在 Android 上实现实时的目标检测功能

在 Android 上使用Paddle-Lite实现实时的目标检测功能 1 环境准备1.1 安装Android Studio1.1.1 安装JAVA JDK1.1.2 Android Studio 安装步骤1.1.3 Android Studio 配置NDK 1.2 Android 手机 2 部署步骤2.1 下载Paddle-Lite-Demo2.2 打开 yolo_detection_demo项目2.2.1 修改buil…

【Spring 篇】MyBatis中的CRUD魔法:数据之美的四重奏

MyBatis&#xff0c;这个数据持久化的魔法师&#xff0c;以其优雅的SQL映射和简洁的配置文件&#xff0c;为我们呈现出一场CRUD&#xff08;Create, Read, Update, Delete&#xff09;的奇妙之旅。在这篇博客中&#xff0c;我们将深入探讨MyBatis中的增、删、改、查操作&#x…

一键搭建你的知识库

效果 说明 由于安装包安装需要glibc>2.7 我就不尝试了 因为glib升级是一个繁琐的过程 没有升级的意义 只是为了体验知识库 没必要浪费时间 1.1docker compose部署trilium 1.1.创建目录 mkdir -p /opt/triliumcd /opt/trilium 1.2.编写docker-comppose.yml文件 vim dock…

非线性失真放大电路设计

文章目录 一、设置要求二、系统组成三、仿真设计3.1 放大电路总体设计3.2 仿真结果3.2.1 正常波形3.2.2 双向失真3.2.3 顶部失真(截至失真)3.2.4 底部失真(饱和失真)3.2.5 交越失真3.2.6 50Khz\2mv放大 四、原理图与PCB设计4.1 放大电路部分原理图4.2 控制电路部分4.3 PCB设计 …

EasyRecovery2024专业免费的数据恢复软件,支持从硬盘、光盘、U盘、移动硬盘、等所有类型的介质上恢复数据。

Ontrack EasyRecovery Home是一款企业级的数据恢复软件&#xff0c;支持从硬盘、光盘、U盘、移动硬盘、硬件RAID及软件RAID等所有类型的介质上恢复数据。支持恢复误删除、磁盘格式化、磁盘重新分区、磁盘逻辑坏道等原因而丢失的数据。支持RAID重建&#xff01;Ontrack EasyReco…

如何正确地为Python项目安装依赖

a、创建Python项目&#xff0c;其结构如下&#xff1a; b、激活虚拟环境 启动DOS窗口—>进入“Scripts”目录&#xff0c;这里为D:\workspace\prj_python_1\venv\Scripts—>执行activate激活虚拟环境&#xff0c;如下所示&#xff1a; Microsoft Windows [版本 10.0.18…