尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

实用指南:C++STL---静态数组array
📅 发布时间:2026/6/20 6:18:28

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

缺点

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

数组选择建议

  • 需要固定大小、性能敏感且在栈上分配时,优先用 std::array
  • 需要动态大小时,用 std::vector
  • 与 C API 交互时,用 .data() 获取底层指针
  • 需要编译期常量数据容器时,std::array 很合适(可配合 constexpr)

相关新闻

  • MCP神器!一键部署连接任何MCP服务器
  • [ docker del imags containers ]
  • Flask的核心知识点如下

最新新闻

  • 嵌入式GUI开发实战:emWin窗口管理器消息机制、ToolTips与多图层应用详解
  • 简单理解:为什么SVPWM没看到提反Clarke变换
  • public-apis 项目深度解析:442K Stars的免费API大全
  • 在哪个软件找工作真实可靠?五大招聘平台实测对比 - 博客万
  • Gemini 3.5国内一键可用:服务发现层软适配实战指南
  • 2026年6月最新江诗丹顿中国官方售后联系电话与客户服务中心网点地址 - 江诗丹顿服务中心

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号