C++23 标准库新增内容全面解析
1. 引言C23 是 C20 之后的一个重要标准更新虽然不像 C11 或 C20 那样带来颠覆性的变化但在标准库方面仍然提供了许多实用的新功能和改进。这些新增内容主要集中在简化常见任务、填补功能空白、提升性能以及增强类型安全等方面。本文将详细介绍 C23 标准库的主要新增内容并通过代码示例展示其用法。2. 容器与算法增强2.1 std::flat_map 和 std::flat_setC23 引入了两个新的关联容器std::flat_map和std::flat_set。它们基于排序的向量实现提供了比传统红黑树实现的std::map和std::set更好的缓存局部性和内存效率但插入和删除操作可能更慢。#include flat_map #include iostream int main() { std::flat_mapstd::string, int scores; // 插入元素 scores.insert({Alice, 95}); scores.insert({Bob, 87}); scores.insert_or_assign(Charlie, 92); // 范围for遍历按键排序 for (const auto [name, score] : scores) { std::cout name : score \n; } // 查找操作 if (auto it scores.find(Alice); it ! scores.end()) { std::cout Found Alice: it-second \n; } return 0; }2.2 std::mdspan - 多维数组视图std::mdspan是一个非拥有型多维数组视图类似于一维的std::span但支持任意维度。它对于科学计算、图像处理和数值模拟等场景非常有用。#include mdspan #include vector #include iostream int main() { std::vectorint data(12); std::iota(data.begin(), data.end(), 1); // 填充1-12 // 创建3x4的二维视图 std::mdspan mat(data.data(), 3, 4); // 访问元素 std::cout Element at (1,2): mat[1, 2] \n; // 遍历所有元素 for (std::size_t i 0; i mat.extent(0); i) { for (std::size_t j 0; j mat.extent(1); j) { std::cout mat[i, j] ; } std::cout \n; } return 0; }2.3 新的算法std::shift_left 和 std::shift_right这两个算法将元素向左或向右移动指定位置移出范围的元素被丢弃空出的位置用默认值填充。#include algorithm #include vector #include iostream int main() { std::vectorint v {1, 2, 3, 4, 5}; // 向左移动2位 auto new_end std::shift_left(v.begin(), v.end(), 2); // v现在为: {3, 4, 5, ?, ?}?表示未指定值 std::cout After shift_left by 2: ; for (int i 0; i 3; i) std::cout v[i] ; std::cout \n; // 向右移动1位 std::shift_right(v.begin(), v.end(), 1); // v现在为: {?, 3, 4, 5, ?} return 0; }3. 字符串与文本处理3.1 std::basic_string::contains()为std::string和std::string_view添加了contains()成员函数用于检查字符串是否包含子串比使用find() ! npos更直观。#include string #include iostream int main() { std::string str Hello, C23 World!; // 检查是否包含子串 if (str.contains(C23)) { std::cout String contains C23\n; } if (str.contains(W)) { std::cout String contains character W\n; } // 也适用于string_view std::string_view sv str; if (sv.contains(World)) { std::cout String view contains World\n; } return 0; }3.2 std::format 增强C23 对std::format进行了多项改进包括支持范围格式化、改进的 Unicode 处理等。#include format #include vector #include iostream int main() { // 范围格式化 std::vectorint nums {1, 2, 3, 4, 5}; std::cout std::format(Numbers: {:n}\n, nums); // 输出: Numbers: 1, 2, 3, 4, 5 // 改进的浮点数格式化 double pi 3.141592653589793; std::cout std::format(Pi: {:.5f}\n, pi); std::cout std::format(Pi in scientific: {:.5e}\n, pi); // 嵌套格式化 std::cout std::format(Vector: {}\n, std::format({}, nums)); return 0; }4. 工具类型与元编程4.1 std::expected - 期望类型std::expectedT, E表示一个可能包含值T或错误E的类型类似于 Rust 的Result类型提供了一种类型安全的错误处理方式。#include expected #include string #include iostream std::expectedint, std::string divide(int a, int b) { if (b 0) { return std::unexpected{Division by zero}; } return a / b; } int main() { auto result1 divide(10, 2); if (result1) { std::cout Result: *result1 \n; } auto result2 divide(10, 0); if (!result2) { std::cout Error: result2.error() \n; } // 使用value_or提供默认值 int val divide(5, 0).value_or(-1); std::cout Value or default: val \n; return 0; }4.2 std::optional 和 std::variant 的 monadic 操作C23 为std::optional和std::variant添加了函数式编程风格的操作如and_then()、or_else()、transform()等。#include optional #include string #include iostream std::optionalint parse_int(const std::string s) { try { return std::stoi(s); } catch (...) { return std::nullopt; } } std::optionalstd::string to_hex(int n) { if (n 0) return std::nullopt; char buffer[20]; sprintf(buffer, %X, n); return buffer; } int main() { std::optionalstd::string input 255; // 链式操作解析字符串 - 转换为十六进制 auto result input .and_then(parse_int) // 如果input有值尝试解析为int .and_then(to_hex) // 如果解析成功转换为十六进制 .transform([](const std::string s) { return 0x s; // 添加前缀 }) .value_or(Invalid input); std::cout Result: result \n; return 0; }5. 并发与异步5.1 std::generator - 协程生成器std::generator是一个用于协程的生成器类型可以方便地创建惰性序列。#include generator #include iostream #include ranges std::generatorint fibonacci(int n) { int a 0, b 1; for (int i 0; i n; i) { co_yield a; int temp a b; a b; b temp; } } int main() { // 生成前10个斐波那契数 for (int num : fibonacci(10)) { std::cout num ; } std::cout \n; // 与ranges结合使用 auto even_fib fibonacci(15) | std::views::filter([](int n) { return n % 2 0; }); std::cout Even Fibonacci numbers: ; for (int num : even_fib) { std::cout num ; } std::cout \n; return 0; }5.2 std::atomic_ref 增强C23 扩展了std::atomic_ref的功能支持更多类型和操作。#include atomic #include thread #include iostream #include vector struct Point { double x, y; // 需要提供默认构造函数 Point() default; Point(double x, double y) : x(x), y(y) {} }; int main() { Point p{1.0, 2.0}; std::atomic_refPoint atomic_p{p}; // 原子地更新整个结构体 Point new_point{3.0, 4.0}; atomic_p.store(new_point); // 原子地读取 Point current atomic_p.load(); std::cout Current point: ( current.x , current.y )\n; // 比较交换操作 Point expected{3.0, 4.0}; Point desired{5.0, 6.0}; if (atomic_p.compare_exchange_strong(expected, desired)) { std::cout CAS succeeded\n; } return 0; }6. 其他重要新增6.1 栈踪库 std::stacktracestd::stacktrace提供了获取当前调用栈信息的能力对于调试和错误报告非常有用。#include stacktrace #include iostream void func_c() { auto trace std::stacktrace::current(); std::cout Stack trace from func_c:\n; for (const auto entry : trace) { std::cout entry.description() \n; } } void func_b() { func_c(); } void func_a() { func_b(); } int main() { func_a(); return 0; }6.2 类型特征增强C23 添加了新的类型特征如std::is_scoped_enum、std::to_underlying等。#include type_traits #include iostream enum class Color { Red, Green, Blue }; enum OldColor { Red, Green, Blue }; int main() { // 检查是否为有作用域的枚举 std::cout std::boolalpha; std::cout Color is scoped enum: std::is_scoped_enum_vColor \n; std::cout OldColor is scoped enum: std::is_scoped_enum_vOldColor \n; // 获取枚举的基础类型值 Color c Color::Green; auto underlying std::to_underlying(c); std::cout Underlying value of Color::Green: underlying \n; return 0; }6.3 数学常量在numbers头文件中添加了更多数学常量。#include numbers #include iostream int main() { using std::numbers; std::cout Pi: numbers::pi \n; std::cout Eulers number: numbers::e \n; std::cout Golden ratio: numbers::phi \n; std::cout sqrt(2): numbers::sqrt2 \n; std::cout ln(2): numbers::ln2 \n; return 0; }7. 总结C23 标准库的新增内容虽然不如 C20 那样庞大但提供了许多实用的改进和新功能新容器std::flat_map、std::flat_set提供了性能与内存的平衡选择多维数组std::mdspan简化了多维数据处理字符串增强contains()方法使子串检查更直观错误处理std::expected提供了类型安全的错误处理机制函数式编程std::optional和std::variant的 monadic 操作协程支持std::generator简化了惰性序列生成调试工具std::stacktrace提供了调用栈追踪能力这些新增功能使 C 在现代编程中更加易用、安全和高效。建议开发者根据项目需求逐步采用这些新特性特别是std::expected和std::f

相关新闻

开源项目维护停滞的应对策略与风险评估指南

开源项目维护停滞的应对策略与风险评估指南

这次我们来看一个比较特殊的项目——"第五季第三集完结了,但是我不想做了"。从标题就能感受到开发者的一种疲惫和无奈,这很可能是一个长期维护的开源项目,作者在完成某个重要版本后决定暂停或放弃。这类项目往往具有很高的实用价值…

2026/7/21 8:23:11阅读更多 →
最近试了下AI Offer,用AI来进化简历和模拟面试还挺简单的

最近试了下AI Offer,用AI来进化简历和模拟面试还挺简单的

写简历最难的,往往不是“没有经历” 每次开始找工作,我都会在简历上反复纠结:项目明明做了不少,写出来却像流水账;同一份简历投不同岗位,又担心重点不够匹配;好不容易改完,排版和导…

2026/7/21 8:23:11阅读更多 →
C++实现OPC DA客户端:从COM原理到工业数据采集实战

C++实现OPC DA客户端:从COM原理到工业数据采集实战

1. 项目概述:为什么我们需要自己动手写一个OPC客户端?在工业自动化领域,数据是流淌的血液。无论是PLC的温度读数、机器人的运行状态,还是生产线的产量统计,这些数据都需要被采集、监控和分析。OPC(OLE for …

2026/7/21 8:23:10阅读更多 →
音乐格式转换终极指南:3步解锁你的加密音频文件

音乐格式转换终极指南:3步解锁你的加密音频文件

音乐格式转换终极指南:3步解锁你的加密音频文件 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://git…

2026/7/21 16:59:58阅读更多 →
提示词生成耗时从8.2s→0.3s:基于时间线压缩的5层缓存架构,已落地金融/医疗双场景实测数据

提示词生成耗时从8.2s→0.3s:基于时间线压缩的5层缓存架构,已落地金融/医疗双场景实测数据

更多请点击: https://kaifayun.com 第一章:提示词生成耗时从8.2s→0.3s:基于时间线压缩的5层缓存架构,已落地金融/医疗双场景实测数据 在高并发实时推理场景下,原始提示词生成模块因频繁调用外部知识图谱与动态模板引…

2026/7/21 16:59:58阅读更多 →
DDrawCompat终极指南:让老游戏在现代Windows上完美运行的简单方案

DDrawCompat终极指南:让老游戏在现代Windows上完美运行的简单方案

DDrawCompat终极指南:让老游戏在现代Windows上完美运行的简单方案 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirror…

2026/7/21 16:59:58阅读更多 →
OpenRun Secrets管理终极指南:保护敏感数据的最佳实践 [特殊字符]

OpenRun Secrets管理终极指南:保护敏感数据的最佳实践 [特殊字符]

OpenRun Secrets管理终极指南:保护敏感数据的最佳实践 🔐 【免费下载链接】openrun Deployment platform for code-first internal tools. Deploy web apps declaratively, on a single-node or on Kubernetes, with OIDC/SAML auth and RBAC. 项目地址…

2026/7/21 16:59:58阅读更多 →
GRDB.swift终极指南:Swift应用数据持久化的完整解决方案

GRDB.swift终极指南:Swift应用数据持久化的完整解决方案

GRDB.swift终极指南:Swift应用数据持久化的完整解决方案 【免费下载链接】GRDB.swift A toolkit for SQLite databases, with a focus on application development 项目地址: https://gitcode.com/GitHub_Trending/gr/GRDB.swift GRDB.swift是一个专注于应用…

2026/7/21 16:59:58阅读更多 →
Unity Multiplayer权威指南:NetworkManager配置与优化最佳实践

Unity Multiplayer权威指南:NetworkManager配置与优化最佳实践

Unity Multiplayer权威指南:NetworkManager配置与优化最佳实践 【免费下载链接】com.unity.multiplayer.docs [ARCHIVED] Open Source documentation for Unity Multiplayer, which includes Netcode for GameObjects, the Unity Transport Package, Multiplayer To…

2026/7/21 16:57:56阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 0:51:49阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 0:51:49阅读更多 →
Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

📌教程适配:OpenClaw v2.7.9 | 兼容 Windows10/11、macOS 双系统 📖前言 当下各类本地 AI 工具层出不穷,多数产品仅能完成文字问答交互,很难直接操控电脑执行实际操作。OpenClaw,业内常称小龙虾 AI&#…

2026/7/21 0:01:46阅读更多 →
Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

聊《一次Codex项目复盘,问题最后出在流程而不是模型》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&…

2026/7/21 0:01:46阅读更多 →
手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

大家好,还是我。前几期带大家做了心情日记本和可视化大屏,后台有朋友留言:“能不能教点好玩的?我想做游戏,但一行代码都不会。”行,这期就安排。今天的目标:从零做一个五子棋游戏。 带AI对战、三…

2026/7/21 0:03:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/20 22:51:39阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/20 18:51:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/20 18:51:18阅读更多 →