C++学习笔记——C++ 新标准(C++11、C++14、C++17)引入的重要特性

目录

1、简介

2.自动类型推导和初始化

示例代码

3.智能指针

示例代码

4.Lambda 表达式

示例代码

5.右值引用和移动语义

示例代码

6.并发编程支持

示例代码

7.其他特性

八、案例:实现一个简单的并发下载器


上一篇文章:

    C++标准模板库(STL)是C++的一个重要组成部分,它提供了一套丰富的通用数据结构和算法。STL以其高度模块化、可复用的特性,在C++编程中发挥着重要作用。本篇博客将带你深入了解STL,并介绍其常见的组件和使用方法。

C++学习笔记——标准模板库-CSDN博客C++标准模板库(STL)是C++的一个重要组成部分,它提供了一套丰富的通用数据结构和算法。STL以其高度模块化、可复用的特性,在C++编程中发挥着重要作用。本篇博客将带你深入了解STL,并介绍其常见的组件和使用方法。C++标准模板库(STL)是C++语言的一个标准库,它提供了一套通用的数据结构和算法,以支持高效的编程。STL的设计目标是使程序员能够以简洁、高效和可复用的方式开发代码。// 输出vector的大小return 0;https://blog.csdn.net/m0_62338174/article/details/135573281?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135573281%22%2C%22source%22%3A%22m0_62338174%22%7D

1、简介

 C++ 是一种功能强大的编程语言,它一直在不断发展和演进。自从 C++11 标准发布以来,C++ 引入了许多重要的新特性,如智能指针、Lambda 表达式、右值引用等。随后的 C++14 和 C++17 标准也带来了更多的改进和增强。本篇博客将详细介绍 C++ 新标准引入的一些重要特性,并给出代码示例和详细解释,帮助读者了解和应用这些特性。

2.自动类型推导和初始化

C++11 引入了 auto 关键字和统一的初始化语法,使得变量的类型推导更加方便。在 C++11 之前,我们必须手动指定变量的类型,例如 int、double 等。但是在某些情况下,类型可能比较复杂或者难以确定,使用 auto 关键字可以自动推导出变量的类型。同时,C++11 还引入了统一的初始化语法,允许我们使用初始化列表对变量进行初始化,这样代码更加简洁和易读。

示例代码

auto x = 10; // x 的类型被推导为 int
auto y = 3.14; // y 的类型被推导为 doublestd::vector<int> nums = {1, 2, 3}; // 使用初始化列表进行初始化

3.智能指针

C++11 引入了智能指针,用于管理动态分配的内存,避免内存泄漏和悬空指针的问题。其中最常用的是 shared_ptr 和 unique_ptr。shared_ptr 允许多个指针共享同一个对象,并且会自动进行内存回收,直到所有指针都不再需要该对象。unique_ptr 则保证每个对象只有一个指针拥有它,可以通过 std::move 函数实现所有权的转移。

示例代码

std::shared_ptr<int> p1 = std::make_shared<int>(10); // 使用 make_shared 创建 shared_ptr
std::unique_ptr<int> p2(new int(20)); // 使用 new 创建 unique_ptrif (p1) {std::cout << *p1 << std::endl; // 访问指针指向的值
}

4.Lambda 表达式

C++11 引入了 Lambda 表达式,允许我们在代码中定义匿名函数,简化了函数对象的使用和编写。Lambda 表达式的基本形式为 [ capture-list ] ( params ) mutable exception -> return-type { body },其中 capture-list 表示变量捕获列表,params 表示参数列表,mutable 和 exception 表示是否可变和异常规范,return-type 表示返回类型,body 表示函数体。

示例代码

std::vector<int> nums = {1, 2, 3, 4, 5};// 使用 Lambda 表达式对容器进行遍历和操作
std::for_each(nums.begin(), nums.end(), [](int n) {std::cout << n * 2 << " ";
});

5.右值引用和移动语义

C++11 引入了右值引用和移动语义,通过 std::move 函数实现对资源的高效转移,提高了性能和效率。右值引用用 && 表示,可以绑定到临时对象、表达式、返回右值引用的函数等,允许我们对这些对象进行高效的转移和管理。移动语义则是指通过右值引用实现资源的转移,避免了复制和销毁的开销。

示例代码

std::string str = "Hello";
std::vector<std::string> vec;vec.push_back(std::move(str)); // 使用 std::move 转移资源std::cout << str << std::endl; // 输出为空,str 的资源已被转移

6.并发编程支持

C++11 引入了一套完整的并发编程库,包括原子操作、线程、互斥量、条件变量等,方便开发者进行多线程编程和并发控制。其中最常用的就是 std::thread 类和 std::mutex 类。std::thread 可以创建新的线程,并执行指定的函数或 Lambda 表达式,std::mutex 则可以保护共享资源,避免多个线程同时访问和修改同一个变量。

示例代码

std::mutex mtx;
int count = 0;std::vector<std::thread> threads;for (int i = 0; i < 10; ++i) {threads.emplace_back([&]() {std::lock_guard<std::mutex> lock(mtx); // 使用互斥量保护共享资源count++;});
}for (auto& thread : threads) {thread.join();
}std::cout << "count: " << count << std::endl;

7.其他特性

C++14 和 C++17 标准引入了更多的改进和增强,如通用 lambda、变长模板、constexpr 函数、初始化列表等。通用 lambda 允许我们对任意类型的参数进行操作,变长模板则可以支持任意数量和任意类型的模板参数,constexpr 函数可以在编译时计算结果,初始化列表则可以方便地对复杂对象进行初始化。

八、案例:实现一个简单的并发下载器

#include <iostream>
#include <vector>
#include <thread>
#include <mutex>std::mutex mtx;void downloadFile(const std::string& url, const std::string& filename) {// 模拟下载文件的耗时操作std::this_thread::sleep_for(std::chrono::seconds(2));// 使用互斥量保护共享资源std::lock_guard<std::mutex> lock(mtx);std::cout << "Downloaded file: " << url << " saved as: " << filename << std::endl;
}int main() {std::vector<std::string> urls = {"http://example.com/file1.txt","http://example.com/file2.txt","http://example.com/file3.txt"};std::vector<std::thread> threads;for (const auto& url : urls) {threads.emplace_back([&]() {// 生成文件名std::string filename = "file_" + std::to_string(std::hash<std::string>()(url)) + ".txt";downloadFile(url, filename);});}for (auto& thread : threads) {thread.join();}return 0;
}

具体而言,程序首先定义了一个包含多个 URL 的 std::vector 对象 urls,这些 URL 表示需要下载的文件地址。然后我们创建了一个 std::vector 对象 threads,用于存储多个线程对象。接着我们使用 for 循环遍历 urls,每次循环都会创建一个新的线程,并将其加入到 threads 中。每个线程都会调用 downloadFile 函数进行文件下载,同时生成一个唯一的文件名。

downloadFile 函数模拟了文件下载的耗时操作,具体而言,我们使用了 std::this_thread::sleep_for 函数,让线程休眠 2 秒钟,模拟文件下载的过程。在函数结束之前,我们使用 std::lock_guardstd::mutex 对共享资源进行了保护,确保每个线程都能够正确地输出下载完成的信息。

以上是一个简单的并发下载器示例。我们使用了 C++11 的并发编程支持,通过创建多个线程并发地下载多个文件。每个线程都会调用 downloadFile 函数进行文件下载,而该函数会使用互斥量保护共享资源,避免多个线程同时访问和修改同一个文件。

通过这个案例,我们可以看到 C++11 的并发编程支持非常强大,可以方便地实现多线程的应用程序,提高程序的性能和效率。同时,使用互斥量等工具可以保证多线程的安全性,避免竞态条件和数据竞争的问题。

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

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

相关文章

电子雨html代码

废话不多说下面是代码&#xff1a; <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Code</title><style>body{margin: 0;overflow: hidden;}</style></head><body><c…

mybatis分页、延迟加载、立即加载、一级缓存、二级缓存

mybatis分页、延迟加载、立即加载、一级缓存、二级缓存 分页延迟加载和立即加载缓存一级缓存二级缓存 分页 分类&#xff1a; 使用Limit&#xff0c;来进行分页&#xff1b;物理分页使用RowBounds集合来保存分页需要数据&#xff0c;来进行分页;逻辑分页&#xff1b;本质是全…

Linux/Networked

Enumeration nmap 网站更新之后有了一个引导模式&#xff0c;更利于学习了&#xff0c;之前看ippsec的视频&#xff0c;要不总是没有思路&#xff0c;现在出现的问题多了提示也更多了&#xff0c;还没有使用&#xff0c;一会用用再说 首先&#xff0c;第一个问题是“目标上正…

大数据毕业设计:基于python美食推荐系统+爬虫+Echarts可视化+协同过滤推荐算法+Django框架(源码)✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

数据结构和算法的部分例题(力扣)

1.数组 1.1 合并一个数组的两个有序区间 public class MargTwo {public static void main(String[] args) {int[] arr1{1,5,6,2,4,10,11};int[] arr2new int[arr1.length];marg2(arr1,0,2,3,6,arr2);}private static void marg2(int[]arr1,int iStar,int iEnd,int jStar,int j…

嵌入式-Stm32-江科大基于标准库的GPIO4个小实验

文章目录 一 、硬件介绍二 、实验&#xff1a;LED闪烁、LED流水灯、蜂鸣器提示2.1 需求1&#xff1a;面包板上的LED以1s为周期进行闪烁。亮0.5s,灭0.5s.....2.2 需求2: 8个LED实现流水灯 三、硬件介绍-按键开关、光敏电阻四、 实验 按键控制LED、光敏传感器控制蜂鸣器4.1 需求1…

【MYSQL】存储引擎MyISAM和InnoDB

MYSQL 存储引擎 查看MySQL提供所有的存储引擎 mysql> show engines; mysql常用引擎包括&#xff1a;MYISAM、Innodb、Memory、MERGE 1、MYISAM&#xff1a;全表锁&#xff0c;拥有较高的执行速度&#xff0c;不支持事务&#xff0c;不支持外键&#xff0c;并发性能差&#x…

ubuntu18.04 安装mysql(命令)

1.安装MySQL #命令1 sudo apt-get update #命令2 sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 2.2 检查mysql服务状态 systemctl status mysql.service 3.配置远程访问 在Ubuntu下MySQL缺省是只允许本地访问的 3.1 首先用根用户进入…

深度学习记录--梯度检验

数值逼近 为了对梯度进行检验&#xff0c;需要计算近似误差值来接近梯度 对于单边误差和双边误差公式&#xff0c;其中双边误差与真实梯度相差更小&#xff0c;故一般采用双边误差公式 双边误差 公式&#xff1a; 梯度检验(gradient checking) 对于成本函数&#xff0c;求出…

2018年认证杯SPSSPRO杯数学建模A题(第一阶段)海豚与沙丁鱼全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 探究海豚猎捕时沙丁鱼群的躲避运动模型 A题 海豚与沙丁鱼 原题再现&#xff1a; 沙丁鱼以聚成大群的方式来对抗海豚的捕食。由于水下光线很暗&#xff0c;所以在距离较远时&#xff0c;海豚只能使用回声定位方法来判断鱼群的整体位置&#xf…

旅游平台day02

1. 用户注册 概述&#xff1a; 常见的注册方式&#xff1a;邮箱注册、手机号注册、昵称注册、或者以上几种同时支持 本项目仅仅支持手机号注册 需求&#xff1a; 项目启动后&#xff0c;访问regist.html进入注册页面 手机号校验 前后台都需要对手机号进行校验 前端校验&am…

iOS上h5长按识别图片二维码,图片会默认放大,禁用这一默认行为

iOS上h5长按识别图片二维码&#xff0c;图片会默认放大&#xff0c;禁用这一默认行为 测试代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

ES可视化工具--ElasticHD

说明 ElasticHD 是 github 上的一个开源的项目&#xff0c;所以他没有官方网站&#xff0c;但 github 上的项目界面也可称为是它的官方界面了。 在 github 上直接搜索 ElasticHD 即可找到它&#xff0c;下面我将留下它的直接跳转链接。ElasticHD 下载 在 github 上搜索到之后…

[Error]连接iPhone调试时提示Failed to prepare the device for development.

环境&#xff1a; iPhone 7 Plus iOS 15.8 Xcode14.2 问题&#xff1a; 连接iPhone设备运行时&#xff0c;设备旁提示如下文案。 Failed to prepare the device for development. 这时强行点击运行按钮&#xff0c;会弹窗提示如下文案。 The run destination ZDMiPhone is n…

Apache Doris (六十四): Flink Doris Connector - (1)-源码编译

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. Flink与Doris版本兼容

CTF CRYPTO 密码学-3

题目名称&#xff1a;反编译 题目描述&#xff1a; 分析 题目给出一个pyc后缀的文件&#xff0c;需要使用uncompyle6模块去还原成py文件 uncompyle6简介 uncompyle6 是一个 Python 反编译器&#xff0c;它能够将 Python 字节码&#xff08;.pyc 文件&#xff09;转换回源代码&…

【征服redis7】谈谈Redis的RDB持久化方式

从现在开始&#xff0c;我们来探讨redis的一个非常重要的问题——集群&#xff0c;要讨论集群&#xff0c;我们需要先理解redis持久化数据的方法&#xff0c;因为集群本质上就是将一个集群的数据同步到其他机器上。 Redis 6的持久化机制主要有两种&#xff1a;RDB&#xff08;…

springboot开启HTTPS

目录 一、前言 HTTP和HTTPS的含义以及区别 二、域名映射 三、添加SSL证书 四、Http转Https 五、内网穿透 一、前言 我们平常写完一个接口&#xff0c;其访问一般都是使用http协议 我们最终想要的结果是使用安全的HTTPS来访问 在我们开始实现之前&#xff0c;我们要先搞明…

烟火识别视频分析系统的应用-河北消防机器人项目

在当前的智能化、信息化时代背景下&#xff0c;河北省消防部门采纳了一项革命性的技术方案 —— 烟火识别视频分析系统&#xff0c;结合消防机器人的使用&#xff0c;大幅提升了火灾预防与应急处理能力。该项目的核心在于通过高精度的视频监控&#xff0c;实时分析识别潜在的火…

【笔记】Helm-3 主题-6 Chart仓库指南

Chart仓库指南 本节介绍如何创建和使用chart仓库。在高层级中&#xff0c;chart仓库是打包的chart存储和分享的位置。 社区的Helm chart仓位于 Artifact Hub &#xff0c;欢迎加入。不过Helm也可以创建并运行您自己的chart仓库。该指南将介绍如何操作。 Artifact Hub 先决条…