实用指南:C++STL---静态数组array

news/2025/11/9 13:35:24/文章来源:https://www.cnblogs.com/gccbuaa/p/19204182

1. std::array 定义

std::array 是 C++11 标准模板库(STL)提供的一个固定大小数组容器,定义在 <array> 头文件中。
它把 C 风格的静态数组(如 int arr[5])封装成一个类模板,并提供 STL 容器的接口,使其能和 STL 算法无缝配合。

定义格式:

#include <array>std::array<T, N> arr;
  • T:元素类型
  • N:数组大小,必须是编译期常量(constexpr)

例子:

std::array<int, 5> a1;         // 5个int,值未初始化std::array<int, 5> a2 = {1,2,3}; // 前3个初始化,剩余为0std::array<int, 5> a3{};        // 所有元素值初始化(为0)

2. std::array优势

C 风格数组有几个明显的缺点:

  1. 容易退化(decay)成指针,丢失尺寸信息
    void func(int arr[]) {
    // 这里 arr 是 int*,sizeof(arr) 不是数组大小
    }
  2. 不支持迭代器,不能直接用 STL 算法
  3. 没有成员函数,需要依赖全局函数(std::begin, std::end 等)

std::array 保留了 C 风格数组固定大小、栈上分配的优点,同时解决了上述缺点,提供:

  • 随机访问迭代器
  • 成员函数接口size(), empty(), front(), back(), data() 等)
  • 支持 STL 算法
  • 值语义(可以整体赋值、按值传递)

3. 特性总结

特性说明
固定大小大小在编译期确定,不能动态增加或减少
连续内存底层是连续内存布局,支持指针运算
栈上存储元素存储在栈上(如果 std::array 本身在栈上)
随机访问支持下标 []at(),时间复杂度 O(1)
可复制支持直接赋值、拷贝构造
可比较支持 ==, !=, <, >, <=, >= 运算符(按字典序)
STL 兼容提供迭代器、begin()/end()rbegin()/rend()

4. 成员类型

std::array 支持的常见类型别名:

std::array<int, 5>::value_type;      // intstd::array<int, 5>::size_type;       // size_tstd::array<int, 5>::reference;       // int&std::array<int, 5>::const_reference; // const int&std::array<int, 5>::iterator;        // 随机访问迭代器std::array<int, 5>::reverse_iterator;// 反向迭代器

5. 成员函数与常用操作

5.1 构造与赋值

std::array<int, 3> a1{1, 2, 3};std::array<int, 3> a2 = a1;      // 拷贝构造std::array<int, 3> a3;a3 = a1;                         // 赋值

5.2 元素访问

std::array<int, 5> arr = {1,2,3,4,5};int x = arr[2];      // 下标访问,无越界检查int y = arr.at(2);   // 带越界检查,抛出 std::out_of_rangeint f = arr.front(); // 第一个元素int b = arr.back();  // 最后一个元素int* p = arr.data(); // 返回指向底层数组的指针

5.3 迭代器

for (auto it = arr.begin(); it != arr.end(); ++it) {
std::cout << *it << " ";
}
// C++11 range-based for
for (int x : arr) {
std::cout << x << " ";
}
// 反向迭代
for (auto it = arr.rbegin(); it != arr.rend(); ++it) {
std::cout << *it << " ";
}

5.4 容量相关

std::array<int, 5> arr;std::cout << arr.size();    // 5std::cout << arr.max_size();// 5(固定大小)std::cout << arr.empty();   // false(大小为0才返回true)

5.5 修改操作

arr.fill(42); // 所有元素设为42
std::array<int, 5> arr2{1,2,3,4,5};arr.swap(arr2); // 交换两个array的内容(必须同类型同大小)

6. 与 STL 算法配合

std::array 是 STL 容器,可直接用 <algorithm> 中的算法:

#include <algorithm>#include <iostream>#include <array>int main() {std::array<int, 5> arr = {3,1,4,1,5};// 排序std::sort(arr.begin(), arr.end());for (int x : arr) std::cout << x << " "; // 1 1 3 4 5std::cout << "\n";// 查找auto it = std::find(arr.begin(), arr.end(), 3);if (it != arr.end()) {std::cout << "找到3在位置:" << (it - arr.begin()) << "\n";}}

7. 与其他数组类型对比

特性C 风格数组std::arraystd::vector
大小编译期固定编译期固定运行期可变
存储位置栈或静态区栈(若对象在栈上)
赋值不能直接整体赋值可以整体赋值可以整体赋值
退化会退化成指针不会退化不会退化
STL 兼容否(需借助 std::begin
内存开销零额外开销零额外开销有控制结构开销

8. 优缺点

优点

  • 零额外开销:和原生数组一样高效
  • 类型安全:不会隐式退化成指针
  • STL 兼容:支持迭代器和 STL 算法
  • 值语义:可直接赋值、按值传递
  • 支持结构化绑定(C++17):
    std::array<int, 3> arr{1,2,3};auto [x, y, z] = arr; // x=1, y=2, z=3

缺点

  • 大小固定:不能动态扩容
  • 大小必须是编译期常量
  • 存储在栈上:如果过大,可能导致栈溢出

数组选择建议

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

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

相关文章

设置linux时间

# 设置时区 sudo timedatectl set-timezone Asia/Shanghai # 开启设置时间 timedatectl set-ntp no # 具体设置时间 timedatectl set-time "2025-06-11 19:05:55" # 重启 reboot # 立即关机 sudo shutdow…

MCP神器!一键部署连接任何MCP服务器

Hello, 大家好,我是程序员海军, 全栈开发 |AI爱好者 | 独立开发。最近一直在研究MCP方面的事情,使用的技术栈是Python + FastAPi + FastMCP,开发了多个MCP-Server,本地化访问没啥问题,准备部署试着玩一下,调研…

MCP神器!一键部署连接任何MCP服务器

Hello, 大家好,我是程序员海军, 全栈开发 |AI爱好者 | 独立开发。最近一直在研究MCP方面的事情,使用的技术栈是Python + FastAPi + FastMCP,开发了多个MCP-Server,本地化访问没啥问题,准备部署试着玩一下,调研…

输入法与思维的边界:一个人重塑输入法的旅程

本文用于记录我与输入法的故事和记录 Apple 生态在 rime 上配置双拼 + 辅助码的过程。输入法与思维的边界:一个人重塑输入法的旅程本文用于记录我与输入法的故事和记录 Apple 生态在 rime 上配置双拼 + 辅助码的过程,…

英语_阅读_Why we dislike change_待读

Most people hate change, which is sad since we often go through changes in life. 大多数人讨厌变化,这很可悲,因为我们的人生中经常会经历变化。 And for some of us, even the smallest changes can upset our…

游戏编程模式-享元模式(Flyweight) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:css、dom 性能优化方向

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

002 vue3-admin项目的目录及文件说明之package.json文件

基本概念 package.json 是 Node.js 项目的核心配置文件,包含了项目的元数据、依赖信息、脚本命令等关键配置。它是 npm/yarn/pnpm 等包管理器的基础。文件结构示例{"name": "vue3-admin","p…

2025年比较好的双缓冲三节轨用户口碑最好的厂家榜

2025年双缓冲三节轨用户口碑最好的厂家排行榜行业背景与市场趋势随着全屋定制家居市场的持续升温,作为核心五金配件的滑轨产品也迎来了快速发展期。据中国五金制品协会最新数据显示,2024年中国滑轨市场规模已达到186…

2025年知名的中空板厂家推荐及选购指南

2025年知名的中空板厂家推荐及选购指南行业背景与市场趋势中空板作为一种轻质、高强度、环保的新型包装材料,近年来在光伏、新能源、电子、物流等领域应用日益广泛。根据中国包装联合会最新数据显示,2024年中国中空板…

[ docker del imags containers ]

要彻底删除所有容器和所有镜像,可以按照以下步骤操作(操作前请确认数据已备份,此操作不可逆): 步骤1:停止并删除所有容器 首先确保所有容器都已停止,然后删除所有容器: # 停止所有正在运行的容器 docker stop …

2025年评价高的冷库提升机TOP品牌厂家排行榜

2025年评价高的冷库提升机TOP品牌厂家排行榜冷库提升机行业背景与市场趋势随着冷链物流行业的快速发展,冷库提升机作为冷链仓储系统中的核心设备,其市场需求持续增长。据中国冷链物流联盟最新数据显示,2024年我国冷…

英语_阅读_Comic books_待读

Comic books are an unusual kind of storybook. 漫画书是一种不同寻常的故事书。 They tell a story using only pictures and speech bubbles or captions. 它们只用图片和对话气泡或文字说明来讲述故事。 The chara…

Flask的核心知识点如下

1. 简介与特点微框架: 核心简单,高度可扩展,不强制使用特定工具或库。优点:学习曲线平缓: 易于上手,适合小型项目和快速开发。 灵活性高: 开发者可以自由选择组件和技术栈。 社区活跃: 拥有丰富的第三方扩展和…

2025年质量好的发热管缩管机厂家选购指南与推荐

2025年质量好的发热管缩管机厂家选购指南与推荐行业背景与市场趋势发热管缩管机作为电热设备制造领域的关键设备,近年来随着家电、汽车、工业设备等行业的快速发展,市场需求持续增长。据中国电器工业协会2024年数据显…

2025年热门的防尘式工业型测力称重变送器厂家最新推荐权威榜

2025年热门的防尘式工业型测力称重变送器厂家最新推荐权威榜行业背景与市场趋势随着工业4.0的深入推进和智能制造需求的持续增长,防尘式工业型测力称重变送器作为工业自动化领域的关键组件,其市场需求呈现稳定上升态…

2025年评价高的MC减速机厂家最新推荐排行榜

2025年评价高的MC减速机厂家最新推荐排行榜行业背景与市场趋势减速机作为工业传动系统的核心部件,在机械制造、自动化生产线、新能源装备等领域扮演着不可或缺的角色。根据中国机械工业联合会最新发布的《2024-2025年…

C++网络编程(十)epoll模型与select的区别 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …