当前位置: 首页 > article >正文

C++17更新内容汇总

C++17 是 C++14 的进一步改进版本,它引入了许多增强特性,优化了语法,并提升了编译期计算能力。以下是 C++17 的主要更新内容:


1. 结构化绑定(Structured Bindings)

允许同时解构多个变量,从 std::tuplestd::pairstructarray 中提取多个值。

#include <tuple>
#include <iostream>std::tuple<int, double, char> getData() {return {42, 3.14, 'a'};
}int main() {auto [x, y, z] = getData();  // 解构赋值std::cout << x << ", " << y << ", " << z << "\n";
}

2. if constexpr

编译期条件判断,避免编译无效代码,提高模板编程灵活性。

#include <iostream>
#include <type_traits>template <typename T>
void printTypeInfo(const T& value) {if constexpr (std::is_integral_v<T>) {std::cout << "Integer: " << value << "\n";} else {std::cout << "Non-integer: " << value << "\n";}
}int main() {printTypeInfo(42);    // 输出: Integer: 42printTypeInfo(3.14);  // 输出: Non-integer: 3.14
}

3. std::optional(可选值)

用于表示可能为空的值,替代 std::pair<bool, T> 这样的方案。

#include <optional>
#include <iostream>std::optional<int> findEven(int n) {return (n % 2 == 0) ? std::optional<int>(n) : std::nullopt;
}int main() {auto result = findEven(5);if (result) {std::cout << "Found: " << *result << "\n";} else {std::cout << "Not found\n";}
}

4. std::variant(类型安全的联合体)

类似 union,但支持类型安全。

#include <variant>
#include <iostream>int main() {std::variant<int, double, std::string> data;data = 42;std::cout << std::get<int>(data) << "\n"; // 输出: 42data = "Hello";std::cout << std::get<std::string>(data) << "\n"; // 输出: Hello
}

5. std::any(任意类型存储)

可以存储任何类型的值。

#include <any>
#include <iostream>int main() {std::any value = 42;std::cout << std::any_cast<int>(value) << "\n";value = std::string("Hello");std::cout << std::any_cast<std::string>(value) << "\n";
}

6. 文件系统库 (<filesystem>)

提供跨平台的文件和目录操作功能。

#include <iostream>
#include <filesystem>int main() {std::filesystem::path p = "/usr/bin";std::cout << "Path: " << p.string() << "\n";
}

7. std::string_view(字符串视图)

std::string 更高效,不需要复制字符串数据。

#include <iostream>
#include <string_view>void print(std::string_view sv) {std::cout << sv << "\n";
}int main() {std::string str = "Hello, World!";print(str);print("C++17");
}

8. std::map::try_emplacestd::unordered_map::try_emplace

避免重复构造对象,提高效率。

#include <map>
#include <iostream>int main() {std::map<int, std::string> m;m.try_emplace(1, "Hello");  // 仅当键 1 不存在时插入std::cout << m[1] << "\n";
}

9. std::scoped_lock(多锁安全管理)

C++17 允许同时锁定多个 std::mutex,避免死锁。

#include <mutex>
#include <thread>std::mutex m1, m2;void task() {std::scoped_lock lock(m1, m2); // 避免死锁// 关键代码区
}

10. std::clamp(值范围约束)

限制值的范围。

#include <algorithm>
#include <iostream>int main() {int x = std::clamp(15, 10, 20);std::cout << x << "\n"; // 输出: 15
}

11. std::reducestd::accumulate

std::reducestd::accumulate 的并行版本,用于高效计算累积和。

#include <numeric>
#include <vector>
#include <iostream>int main() {std::vector<int> v{1, 2, 3, 4, 5};int sum = std::reduce(v.begin(), v.end()); // 并行累加std::cout << sum << "\n"; // 输出: 15
}

12. constexpr if(编译期条件判断)

在模板编程中进行编译期条件判断,提高代码效率。

template <typename T>
void func(T value) {if constexpr (std::is_integral_v<T>) {std::cout << "Integer\n";} else {std::cout << "Non-integer\n";}
}

13. std::shared_mutex(读写锁)

std::shared_mutex 允许多个线程同时读取数据,但写入时必须独占。

#include <shared_mutex>
#include <thread>std::shared_mutex smutex;void read() {std::shared_lock lock(smutex); // 共享锁,多个线程可读
}void write() {std::unique_lock lock(smutex); // 独占锁
}

总结

C++17 主要增强了性能、简化了代码并提高了类型安全性。关键特性包括:

  • 语法改进:结构化绑定、if constexpr
  • 新增标准库std::optionalstd::variantstd::any
  • 性能提升std::string_viewstd::reduce
  • 并发支持std::shared_mutexstd::scoped_lock
  • 文件系统支持std::filesystem

这些新特性使得 C++17 在现代 C++开发中更高效、更安全、更易读。

相关文章:

C++17更新内容汇总

C17 是 C14 的进一步改进版本&#xff0c;它引入了许多增强特性&#xff0c;优化了语法&#xff0c;并提升了编译期计算能力。以下是 C17 的主要更新内容&#xff1a; 1. 结构化绑定&#xff08;Structured Bindings&#xff09; 允许同时解构多个变量&#xff0c;从 std::tup…...

ST 芯片架构全景速览:MCU、无线 SoC、BLE 模块、MPU 差异详解

在嵌入式开发中,ST 是一个非常常见的芯片厂商,其产品线覆盖了 MCU、无线芯片、BLE 模块以及运行 Linux 的 MPU 等多个领域。很多开发者初次接触 ST 时会对这些产品之间的关系感到困惑。 本文从分类视角出发,带你快速了解 ST 芯片家族的核心架构和主要用途。 🧭 ST 芯片四…...

AtCoder Beginner Contest 400(ABCDE)

A - ABC400 Party 翻译&#xff1a; 在 ABC400 的纪念仪式上&#xff0c;我们想把 400 人排成 A 行 B 列的长方形&#xff0c;且不留任何空隙。 给你一个正整数 A&#xff0c;请打印可以这样排列的正整数 B 的值。如果没有这样的正整数 B&#xff0c;则打印-1。 思路&#xff…...

Flask+Vue构建图书管理系统及Echarts组件的使用

教程视频链接从零开始FlaskVue前后端分离图书管理系统 后端 项目下载地址 其中venv为该项目的虚拟环境&#xff0c;已安装所有依赖 使用方法&#xff1a; 在pycharm终端中flask create一下&#xff08;因为写了一个自定义命令的代码&#xff09;&#xff0c;初始化books数据…...

【项目管理】第2章 信息技术发展 --知识点整理

Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 对应:第1章-第5章 (二)知识笔记 二、信息技术的发展 1. 信息技术及其发展 1)计算机软硬件 计算机硬件由电子机械、光电元件等组成的物理装置,提供物质基础给计算机软件运行。软件包括程…...

Spring 中有哪些设计模式?

&#x1f9e0; 一、Spring 中常见的设计模式 设计模式类型Spring 中的应用场景单例模式创建型默认 Bean 是单例的工厂模式创建型BeanFactory、FactoryBean抽象工厂模式创建型ApplicationContext 提供多个工厂接口代理模式结构型AOP 动态代理&#xff08;JDK/CGLIB&#xff09;…...

4-c语言中的数据类型

一.C 语⾔中的常量 1.生活中的数据 整数&#xff1a; 100,200,300,400,500 小数: 11.11 22.22 33.33 字母&#xff1a; a&#xff0c;b&#xff0c;c&#xff0c;d A&#xff0c;B&#xff0c;C&#xff0c;D 在 C 语⾔中我们把字⺟叫做字符. 字符⽤单引号引⽤。例如A’ 单词…...

LORA+llama模型微调全流程

LORAllama.cpp模型微调全流程 准备阶段 1.下载基础大模型 新建一个download.py脚本 from modelscope import snapshot_download#模型存放路径 model_path /root/autodl-tmp #模型名字 name itpossible/Chinese-Mistral-7B-Instruct-v0.1 model_dir snapshot_download(na…...

02_使用Docker在服务器上部署Jekins实现项目的自动化部署

02_使用Docker在服务器上部署jenkins实现项目的自动化部署 一、使用docker拉取阿里云容器私有镜像仓库内的jenkins镜像 登录阿里云Docker Registry $ sudo docker login --usernamewxxxo1xxx registry.cn-shanghai.aliyuncs.com用于登录的用户名为阿里云账号全名&#xff0c…...

Spring 执行流程(源码)

我们对SpringApplication中的run()方法内部进行一些简单的分析 1. //记录一下程序启动开始的事件&#xff0c;用于之后的统计耗时 long startTime System.nanoTime(); //通过调用SpringApplication的**createBootstrapContext()**方法&#xff0c;创建**bootstrapContext**…...

Python学习之numpy

Python学习之numpy 数组是Numpy库的核心数据结构。 NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。 Numeric&#xff0c;即 NumPy 的前身&#xff0c;是由 Jim Hugunin 开发的。 也开发了另一个包 Numarr…...

安装完 miniconda3 ,cmd无法执行 conda 命令

提示&#xff1a;安装 miniconda3 文章目录 前言一、安装二、安装完&#xff0c;cmd 无法执行 conda 前言 提示&#xff1a;版本 系统&#xff1a;win10 codna: miniconda3 安装完 miniconda3 &#xff0c;cmd无法执行 conda 命令 提示&#xff1a;以下是本篇文章正文内容&am…...

PyTorch 实现图像版多头注意力(Multi-Head Attention)和自注意力(Self-Attention)

本文提供一个适用于图像输入的多头注意力机制&#xff08;Multi-Head Attention&#xff09;PyTorch 实现&#xff0c;适用于 ViT、MAE 等视觉 Transformer 中的注意力计算。 模块说明 输入支持图像格式 (B, C, H, W)内部转换为序列 (B, N, C)&#xff0c;其中 N H * W多头注…...

从 Credit Metrics 到 CPV:现代信用风险模型的进化与挑战

文章目录 一、信用风险基础二、Credit Risk 模型核心思想关键假设模型框架实施步骤优缺点适用场景 三、Credit Metrics 模型核心思想关键假设模型框架实施步骤优缺点适用场景 四、Credit Portfolio View 模型核心思想关键假设模型框架实施步骤优缺点适用场景 五、总结 一、信用…...

Docker快速安装MongoDB并配置主从同步

目录 一、创建相关目录及授权 二、下载并运行MongoDB容器 三、配置主从复制 四、客户端远程连接 五、验证主从同步 六、停止和恢复复制集 七、常用命令 一、创建相关目录及授权 创建主节点mongodb数据及日志目录并授权 mkdir -p /usr/local/mongodb/mongodb1/data mkdir …...

Kafka 中的事务

Kafka 中的 事务&#xff08;Transactions&#xff09; 是为了解决 消息处理的原子性和幂等性问题&#xff0c;确保一组消息要么全部成功写入、要么全部失败&#xff0c;不出现中间状态或重复写入。事务机制尤其适合于 “精确一次&#xff08;Exactly-Once&#xff09;” 的处理…...

C++ 内存访问模式优化:从架构到实践

内存架构概览&#xff1a;CPU 与内存的 “速度博弈” 层级结构&#xff1a;从寄存器到主存 CPU 堪称计算的 “大脑”&#xff0c;然而它与内存之间的速度差距&#xff0c;宛如高速公路与乡间小路。现代计算机借助多级内存体系来缓和这一矛盾&#xff0c;其核心思路是&#xf…...

Golang系列 - 内存对齐

Golang系列-内存对齐 常见类型header的size大小内存对齐空结构体类型参考 摘要: 本文将围绕内存对齐展开, 包括字符串、数组、切片等类型header的size大小、内存对齐、空结构体类型的对齐等等内容. 关键词: Golang, 内存对齐, 字符串, 数组, 切片 常见类型header的size大小 首…...

SOMEIP通信矩阵解读

目录 1 摘要2 SOME/IP通信矩阵详细属性定义与示例2.1 服务基础属性2.2 数据类型定义2.3 服务实例与网络配置参数2.4 SOME/IP-SD Multicast 配置&#xff08;SOME/IP服务发现组播配置&#xff09;2.5 SOME/IP-SD Unicast 配置2.6 SOME/IP-SD ECU 配置参数详解 3 总结 1 摘要 本…...

Excel + VBA 实现“准实时“数据的方法

Excel 本身是静态数据处理工具,但结合 VBA(Visual Basic for Applications) 可以实现 准实时数据更新,不过严格意义上的 实时数据(如毫秒级刷新)仍然受限。以下是详细分析: 1. Excel + VBA 实现“准实时”数据的方法 (1) 定时刷新(Timer 或 Application.OnTime) Appl…...

网络原理 - HTTP/HTTPS

1. HTTP 1.1 HTTP是什么&#xff1f; HTTP (全称为 “超文本传输协议”) 是⼀种应用非常广泛的应用层协议. HTTP发展史&#xff1a; HTTP 诞生于1991年. 目前已经发展为最主流使用的⼀种应用层协议 最新的 HTTP 3 版本也正在完善中, 目前 Google / Facebook 等公司的产品已经…...

C++设计模式-解释器模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析

一、解释器模式的基本介绍 1.1 模式定义与核心思想 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是为特定领域语言&#xff08;DSL&#xff09;定义语法规则&#xff0c;并构建一个解释器来解析和执行该语言的句子。它…...

OCC Shape 操作

#pragma once #include <iostream> #include <string> #include <filesystem> #include <TopoDS_Shape.hxx> #include <string>class GeometryIO { public:// 加载几何模型&#xff1a;支持 .brep, .step/.stp, .iges/.igsstatic TopoDS_Shape L…...

深度学习入门(四):误差反向传播法

文章目录 前言链式法则什么是链式法则链式法则和计算图 反向传播加法节点的反向传播乘法节点的反向传播苹果的例子 简单层的实现乘法层的实现加法层的实现 激活函数层的实现ReLu层Sigmoid层 Affine层/SoftMax层的实现Affine层Softmax层 误差反向传播的实现参考资料 前言 上一篇…...

Linux:页表详解(虚拟地址到物理地址转换过程)

文章目录 前言一、分页式存储管理1.1 虚拟地址和页表的由来1.2 物理内存管理与页表的数据结构 二、 多级页表2.1 页表项2.2 多级页表的组成 总结 前言 在我们之前的学习中&#xff0c;我们对于页表的认识仅限于虚拟地址到物理地址转换的桥梁&#xff0c;然而对于具体的转换实现…...

AF3 OpenFoldDataLoader类解读

AlphaFold3 data_modules 模块的 OpenFoldDataLoader 类继承自 PyTorch 的 torch.utils.data.DataLoader。该类主要对原始 DataLoader 做了批数据增强与控制循环迭代次数(recycling)相关的处理。 源代码: class OpenFoldDataLoader(torch.utils.data.DataLoader):def __in…...

初见TypeScript

类型语言&#xff0c;在代码规模逐渐增大时&#xff0c;类型相关的错误难以排查。TypeScript 由微软开发&#xff0c;它本质上是 JavaScript 的超集&#xff0c;为 JavaScript 添加了静态类型系统&#xff0c;让开发者在编码阶段就能发现潜在类型错误&#xff0c;提升代码质量&…...

常见的 JavaScript 框架和库

在现代前端开发中&#xff0c;JavaScript框架和库成为了构建高效、可维护应用程序的关键工具。本文将介绍四个常见的JavaScript框架和库&#xff1a;React、Vue.js、Angular 和 Node.js&#xff0c;并探讨它们的特点、使用场景及适用场合。 1. React — 构建用户界面的JavaScri…...

机器学习代码基础——ML2 使用梯度下降的线性回归

ML2 使用梯度下降的线性回归 牛客网 描述 编写一个使用梯度下降执行线性回归的 Python 函数。该函数应将 NumPy 数组 X&#xff08;具有一列截距的特征&#xff09;和 y&#xff08;目标&#xff09;作为输入&#xff0c;以及学习率 alpha 和迭代次数&#xff0c;并返回一个…...

PostgreSQL 一文从安装到入门掌握基本应用开发能力!

本篇文章主要讲解 PostgreSQL 的安装及入门的基础开发能力,包括增删改查,建库建表等操作的说明。navcat 的日常管理方法等相关知识。 日期:2025年4月6日 作者:任聪聪 一、 PostgreSQL的介绍 特点:开源、免费、高性能、关系数据库、可靠性、稳定性。 官网地址:https://w…...