C++28 STL容器--array

std::array核心定位

std::array是 C++11 引入的静态数组封装,本质是对 C 风格静态数组(如int arr[5])的 “现代化升级”,核心目标:

  • 保留 C 数组 “栈上分配、高效访问” 的优点;
  • 弥补 C 数组 “类型不安全、无边界检查、无容器接口” 的缺陷;
  • 大小编译期固定,无堆内存开销,无需手动管理内存。

核心用法

1. 基本定义与初始化
#include <array> // 必须包含头文件 #include <iostream> int main() { // 方式1:默认初始化(内置类型为随机值,类类型调用默认构造) std::array<int, 5> arr1; // 方式2:聚合初始化(类似C数组,推荐) std::array<int, 5> arr2 = {1, 2, 3, 4, 5}; std::array<int, 5> arr3{1, 2, 3, 4, 5}; // C++11起支持列表初始化 // 方式3:部分初始化(未初始化的元素补0) std::array<int, 5> arr4 = {1, 2}; // 结果:[1,2,0,0,0] // 方式4:填充初始化(所有元素设为同一值) std::array<int, 5> arr5; arr5.fill(8); // 结果:[8,8,8,8,8] return 0; }
2. 元素访问(4 种方式)
std::array<int, 5> arr = {1, 2, 3, 4, 5}; // 方式1:operator[](无边界检查,高效,推荐常规场景) std::cout << arr[2] << std::endl; // 输出3 // 方式2:at()(带边界检查,越界抛异常,调试/安全场景) try { std::cout << arr.at(10) << std::endl; // 越界,抛std::out_of_range } catch (const std::out_of_range& e) { std::cerr << e.what() << std::endl; } // 方式3:front()/back()(首尾元素,N=0时调用未定义) std::cout << arr.front() << std::endl; // 输出1 std::cout << arr.back() << std::endl; // 输出5 // 方式4:data()(获取原始指针,兼容C风格接口) int* ptr = arr.data(); std::cout << ptr[3] << std::endl; // 输出4
3. 容量与迭代器
std::array<int, 5> arr = {1, 2, 3, 4, 5}; // 容量(编译期固定,无扩容) std::cout << arr.size() << std::endl; // 输出5(constexpr,编译期确定) std::cout << arr.max_size() << std::endl;// 输出5(和size()相等) std::cout << arr.empty() << std::endl; // 输出false(N=0时为true) // 迭代器(支持范围for、算法库) for (auto it = arr.begin(); it != arr.end(); ++it) { std::cout << *it << " "; // 输出1 2 3 4 5 } // 反向迭代器 for (auto it = arr.rbegin(); it != arr.rend(); ++it) { std::cout << *it << " "; // 输出5 4 3 2 1 } // 范围for循环(简洁) for (int num : arr) { std::cout << num << " "; }
4. 其他常用操作
std::array<int, 5> arr1 = {1, 2, 3, 4, 5}; std::array<int, 5> arr2 = {6, 7, 8, 9, 10}; // 交换两个array(要求大小相同) arr1.swap(arr2); // arr1变为[6,7,8,9,10],arr2变为[1,2,3,4,5] // 排序(结合算法库) #include <algorithm> std::array<int, 5> arr3 = {5, 3, 1, 4, 2}; std::sort(arr3.begin(), arr3.end()); // 结果:[1,2,3,4,5]

关键特性(核心设计逻辑)

  1. 内存分配:栈上分配,无堆内存开销,析构时无需释放内存,效率和 C 数组一致;
  2. 大小固定:模板参数N是编译期常量,无法动态扩容 / 缩容(无reserve()/resize()接口);
  3. 类型安全:模板绑定元素类型和大小,避免 C 数组 “数组名隐式转指针” 导致的类型丢失;
  4. 边界检查at()提供运行时边界检查,operator[]无检查(兼顾效率);
  5. 兼容 STL:支持迭代器、算法库(sort/find等),可无缝融入 STL 容器体系;
  6. 空数组特化:当N=0时,std::array<T,0>仍合法(迭代器返回空指针,size()=0)。

总结

  1. std::array是 C 静态数组的现代化封装,栈上存储、大小固定、高效且类型安全;
  2. 核心优势:兼顾 C 数组的效率 + STL 容器的易用性,支持边界检查和算法库;
  3. 最佳场景:固定大小、栈上存储、需兼容 STL 的数组场景,替代 C 风格数组优先选它。

自己实现的源码

#include <cstddef> // size_t #include <iterator> // 迭代器相关 #include <stdexcept> // 异常(边界检查) namespace std { // 模板参数:T是元素类型,N是数组大小(编译期常量) template <typename T, size_t N> class array { public: // ========== 类型别名(容器通用接口) ========== using value_type = T; using pointer = T*; using const_pointer = const T*; using reference = T&; using const_reference = const T&; using size_type = size_t; using difference_type = ptrdiff_t; using iterator = T*; // 迭代器直接用原生指针(随机访问迭代器) using const_iterator = const T*; using reverse_iterator = std::reverse_iterator<iterator>; using const_reverse_iterator = std::reverse_iterator<const_iterator>; // ========== 核心成员:底层静态数组(私有) ========== // 直接存储元素,无额外封装(栈上分配,大小N) T _M_elems[N]; // ========== 迭代器接口 ========== iterator begin() noexcept { return _M_elems; } const_iterator begin() const noexcept { return _M_elems; } iterator end() noexcept { return _M_elems + N; } const_iterator end() const noexcept { return _M_elems + N; } reverse_iterator rbegin() noexcept { return reverse_iterator(end()); } const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); } reverse_iterator rend() noexcept { return reverse_iterator(begin()); } const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); } // ========== 元素访问 ========== // 普通访问(无边界检查,高效) reference operator[](size_type i) noexcept { return _M_elems[i]; } const_reference operator[](size_type i) const noexcept { return _M_elems[i]; } // 带边界检查的访问(调试/安全场景,越界抛异常) reference at(size_type i) { if (i >= N) { throw std::out_of_range("array::at: index out of bounds"); } return _M_elems[i]; } const_reference at(size_type i) const { if (i >= N) { throw std::out_of_range("array::at: index out of bounds"); } return _M_elems[i]; } // 首/尾元素访问 reference front() noexcept { return _M_elems[0]; } const_reference front() const noexcept { return _M_elems[0]; } reference back() noexcept { return _M_elems[N - 1]; } const_reference back() const noexcept { return _M_elems[N - 1]; } // 获取原始指针(兼容C风格数组) pointer data() noexcept { return _M_elems; } const_pointer data() const noexcept { return _M_elems; } // ========== 容量接口 ========== // 大小固定,size()返回编译期常量N constexpr size_type size() const noexcept { return N; } // 最大容量等于size(无扩容) constexpr size_type max_size() const noexcept { return N; } // 仅当N=0时为空 constexpr bool empty() const noexcept { return N == 0; } // ========== 操作接口 ========== // 填充所有元素为指定值 void fill(const T& value) { for (size_type i = 0; i < N; ++i) { _M_elems[i] = value; } } // 交换两个array(要求大小相同) void swap(array& other) noexcept { // 逐元素交换(或用std::swap_ranges,效率更高) for (size_type i = 0; i < N; ++i) { std::swap(_M_elems[i], other._M_elems[i]); } } // ========== 空数组特化(N=0) ========== // 当N=0时,_M_elems为空,需特殊处理迭代器(避免指针越界) template <typename T> class array<T, 0> { // 空数组无底层存储,迭代器返回nullptr或特殊标记 // 核心接口:size()=0,empty()=true,at()抛异常等 }; }; // ========== 全局swap函数(重载,匹配容器规范) ========== template <typename T, size_t N> void swap(array<T, N>& a, array<T, N>& b) noexcept { a.swap(b); } } // namespace std

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

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

相关文章

HY-MT1.5-7B应用:专业领域文档翻译优化

HY-MT1.5-7B应用&#xff1a;专业领域文档翻译优化 1. 引言 随着全球化进程的加速&#xff0c;跨语言信息流通成为企业、科研机构乃至个人日常工作的关键环节。在众多翻译需求中&#xff0c;专业领域文档翻译因其术语密集、语境依赖性强、格式要求严格等特点&#xff0c;长期…

PDF-Extract-Kit详细步骤:构建PDF处理REST API

PDF-Extract-Kit详细步骤&#xff1a;构建PDF处理REST API 1. 引言 1.1 技术背景与业务需求 在当前数字化办公和学术研究的背景下&#xff0c;PDF文档已成为信息传递的主要载体。然而&#xff0c;PDF格式的封闭性导致其内容难以直接提取和再利用&#xff0c;尤其是在处理包含…

PDF-Extract-Kit OCR实战:中英文混合识别详细步骤

PDF-Extract-Kit OCR实战&#xff1a;中英文混合识别详细步骤 1. 引言 1.1 业务场景描述 在日常工作中&#xff0c;我们经常需要从PDF文档或扫描图片中提取文字内容&#xff0c;尤其是中英文混合的学术论文、技术报告和商务文件。传统的手动输入方式效率低下且容易出错&…

RS485半双工通信时序优化在STM32中的实践

RS485半双工通信时序优化在STM32中的实战精要工业现场&#xff0c;一条屏蔽双绞线横穿数十米&#xff0c;连接着PLC、变频器和温控仪表。上位机轮询指令刚发出&#xff0c;响应却迟迟不回——是线路干扰&#xff1f;还是协议解析出错&#xff1f;经验丰富的工程师知道&#xff…

PDF-Extract-Kit部署案例:学术期刊元数据提取系统

PDF-Extract-Kit部署案例&#xff1a;学术期刊元数据提取系统 1. 引言 1.1 业务场景描述 在科研与出版领域&#xff0c;大量学术资源以PDF格式存在&#xff0c;尤其是期刊论文、会议文章和学位论文。这些文档中蕴含丰富的结构化信息——如标题、作者、摘要、公式、表格等元数…

HY-MT1.5模型融合:与其他翻译引擎协作

HY-MT1.5模型融合&#xff1a;与其他翻译引擎协作 1. 引言 随着全球化进程的加速&#xff0c;跨语言沟通已成为企业、开发者乃至个人用户的刚需。尽管市面上已有多个成熟的商业翻译服务&#xff0c;但在特定场景下&#xff0c;如低延迟实时翻译、边缘设备部署或定制化术语处理…

STM32CubeMX下载安装过程中的权限问题图解说明

STM32CubeMX安装卡住&#xff1f;别让权限问题拖垮你的开发起点你有没有遇到过这种情况&#xff1a;好不容易从ST官网下载了STM32CubeMX的安装包&#xff0c;双击运行后进度条走到一半突然卡住、闪退&#xff0c;或者启动时报错“Failed to initialize Java Virtual Machine”&…

UART串口通信错误帧检测在工控行业的应用:操作指南

工业现场的“隐形守护者”&#xff1a;UART错误帧检测实战解析在自动化产线轰鸣运转的背后&#xff0c;无数设备正通过看似古老的串口默默对话。你是否曾遇到过这样的场景——某台传感器突然上报异常数据&#xff0c;PLC执行了未下发的指令&#xff0c;或是HMI界面频繁闪退&…

PDF-Extract-Kit常见误区:新手容易犯的错误

PDF-Extract-Kit常见误区&#xff1a;新手容易犯的错误 1. 引言 1.1 工具背景与使用现状 PDF-Extract-Kit 是由开发者“科哥”基于开源生态二次开发构建的一款PDF智能提取工具箱&#xff0c;集成了布局检测、公式识别、OCR文字提取、表格解析等核心功能。其WebUI界面简洁直观…

PDF-Extract-Kit代码实例:实现PDF公式检测与识别

PDF-Extract-Kit代码实例&#xff1a;实现PDF公式检测与识别 1. 引言&#xff1a;PDF智能提取的工程挑战与解决方案 在科研、教育和出版领域&#xff0c;PDF文档中包含大量结构化内容&#xff0c;如数学公式、表格和图文混排布局。传统OCR工具难以精准识别这些复杂元素&#…

PDF-Extract-Kit性能优化:异步处理与队列管理

PDF-Extract-Kit性能优化&#xff1a;异步处理与队列管理 1. 背景与挑战 PDF-Extract-Kit 是一个由开发者“科哥”二次开发构建的 PDF 智能提取工具箱&#xff0c;集成了布局检测、公式识别、OCR 文字识别、表格解析等核心功能。其基于 YOLO 模型、PaddleOCR 和深度学习技术&…

HY-MT1.5翻译模型入门必看:术语干预与上下文翻译详解

HY-MT1.5翻译模型入门必看&#xff1a;术语干预与上下文翻译详解 1. 引言&#xff1a;腾讯开源的混元翻译新标杆 随着全球化进程加速&#xff0c;高质量、低延迟的机器翻译需求日益增长。传统翻译模型在专业术语一致性、多语言混合场景和上下文连贯性方面常表现不佳&#xff…

利用U8g2库驱动SSD1306:Arduino核心要点

用U8g2玩转SSD1306 OLED&#xff1a;Arduino实战全解析 你有没有过这样的经历&#xff1f;手头一块小巧的0.96英寸蓝白OLED屏&#xff0c;接上Arduino却不知道从何下手——是该写IC命令&#xff1f;还是先配置寄存器&#xff1f;对比度怎么调&#xff1f;显示中文会不会炸内存…

JFlash下载常见问题及工业现场解决方案

JFlash下载常见问题及工业现场实战解决方案 在嵌入式系统的开发与量产过程中&#xff0c;固件烧录是连接软件与硬件的关键一步。无论你是调试一块新板子的工程师&#xff0c;还是负责千台设备批量编程的产线主管&#xff0c; J-Flash 几乎都曾出现在你的工具链中。 作为SEG…

PDF-Extract-Kit架构解析:模块化设计实现高效PDF处理

PDF-Extract-Kit架构解析&#xff1a;模块化设计实现高效PDF处理 1. 引言&#xff1a;智能PDF处理的工程挑战与解决方案 在科研、教育和企业文档管理中&#xff0c;PDF作为标准格式承载了大量结构化信息。然而&#xff0c;传统PDF工具往往只能进行线性文本提取&#xff0c;难…

科哥PDF-Extract-Kit最佳实践:企业文档数字化解决方案

科哥PDF-Extract-Kit最佳实践&#xff1a;企业文档数字化解决方案 1. 引言&#xff1a;企业文档数字化的挑战与PDF-Extract-Kit的价值 在当今企业信息化进程中&#xff0c;大量历史文档以PDF或扫描图像形式存在&#xff0c;这些非结构化数据难以直接用于数据分析、知识管理或…

Proteus使用教程零基础指南:快速上手电子设计仿真

从零开始玩转Proteus&#xff1a;电子设计仿真实战入门指南 你有没有过这样的经历&#xff1f; 焊了一块电路板&#xff0c;通电后芯片冒烟&#xff1b;写好的单片机程序下载进去&#xff0c;外设毫无反应&#xff0c;却不知道是代码错了还是接线错了&#xff1b;想做个课程设…

从单语到多语:HY-MT1.5多语言网站建设方案

从单语到多语&#xff1a;HY-MT1.5多语言网站建设方案 随着全球化进程的加速&#xff0c;企业与用户之间的语言壁垒日益成为数字服务拓展的关键瓶颈。尤其在内容密集型网站场景中&#xff0c;如何高效、准确地实现多语言内容呈现&#xff0c;已成为提升用户体验和市场渗透率的…

腾讯开源翻译模型应用:游戏多语言本地化方案

腾讯开源翻译模型应用&#xff1a;游戏多语言本地化方案 随着全球化进程的加速&#xff0c;游戏出海已成为国内厂商的重要战略方向。然而&#xff0c;语言障碍始终是本地化过程中的核心挑战——既要保证翻译准确&#xff0c;又要兼顾文化适配、术语统一和实时响应。传统商业翻…

Proteus仿真结合Keil实现单片机多任务调度方案

用Proteus Keil 搞定单片机多任务调度&#xff1a;从代码到仿真的完整闭环你有没有过这样的经历&#xff1f;写好了一段多任务程序&#xff0c;烧进板子后发现LED不闪、串口没输出&#xff0c;调试器一接上去系统又“恢复正常”了——典型的时序敏感型bug。更头疼的是&#xf…