在 C++ 中,std::array
是 C++11 引入的一个定长数组容器,是对 C 语言原生数组(如 int arr[10]
)的封装,提供了更多的容器操作接口和类型安全,属于 <array>
头文件。
1. 基本特性
特性 | 描述 |
---|---|
定长 | 大小在编译时确定,不能动态改变 |
栈分配 | 所有元素在栈上连续存储 |
支持 STL 算法 | 可以与 std::sort 、std::for_each 等配合使用 |
类型安全 | 支持迭代器、边界检查等功能 |
拷贝赋值 | 支持整体拷贝和赋值操作 |
2. 语法形式
#include <array>
std::array<类型, 大小> 数组名;
示例:
std::array<int, 5> arr = {1, 2, 3, 4, 5};
3. 常用操作函数
成员函数 | 功能 |
---|---|
at(i) | 返回第 i 个元素,带边界检查 |
operator[] | 返回第 i 个元素,不带检查 |
front() | 返回第一个元素 |
back() | 返回最后一个元素 |
data() | 返回指向底层数组的指针 |
size() | 返回元素个数 |
fill(value) | 用 value 填充所有元素 |
begin(), end() | 返回迭代器用于遍历 |
swap(other) | 与另一个 std::array 交换内容 |
4. 示例代码详解
示例 1:基本用法
#include <iostream>
#include <array>
int main() {
std::array<int, 5> arr = {10, 20, 30, 40, 50};
std::cout << "Size: " << arr.size() << std::endl;
std::cout << "First element: " << arr.front() << std::endl;
std::cout << "Last element: " << arr.back() << std::endl;
// 使用at()安全访问元素
for (size_t i = 0; i < arr.size(); ++i)
std::cout << "Element " << i << ": " << arr.at(i) << std::endl;
// 修改元素
arr[2] = 99;
// 遍历
for (int val : arr)
std::cout << val << " ";
std::cout << std::endl;
return 0;
}
示例 2:与 STL 算法结合
#include <algorithm>
#include <array>
#include <iostream>
int main() {
std::array<int, 6> arr = {5, 3, 8, 1, 4, 6};
std::sort(arr.begin(), arr.end());
for (const auto& v : arr)
std::cout << v << " ";
std::cout << std::endl;
return 0;
}
示例 3:使用 fill()
和 data()
#include <iostream>
#include <array>
int main() {
std::array<int, 4> arr;
arr.fill(7);
// 输出所有元素
for (auto x : arr)
std::cout << x << " ";
std::cout << std::endl;
// 原始指针访问
int* p = arr.data();
p[0] = 100;
std::cout << "First element via pointer: " << arr[0] << std::endl;
return 0;
}
️ 注意事项
-
数组大小必须是编译期常量
int n = 5; std::array<int, n>; // ❌ 错误:n 不是常量表达式
-
不能动态扩容或缩减
如果需要动态大小,请使用std::vector
。 -
初始化不足位时,未初始化部分为 0
std::array<int, 4> arr = {1, 2}; // 等价于 {1, 2, 0, 0}
-
拷贝语义和赋值语义是值语义
std::array<int, 3> a = {1, 2, 3}; std::array<int, 3> b = a; // 拷贝
-
与原生数组的主要区别:支持 STL 接口
原生数组int arr[5]
不支持.size()
、.at()
、.begin()
等函数。
与 std::vector
对比
项目 | std::array | std::vector |
---|---|---|
大小 | 固定,编译期常量 | 可变,运行时动态增长 |
存储位置 | 栈内存 | 堆内存 |
性能 | 更快(无动态分配) | 稍慢(动态分配) |
使用场景 | 小型、高性能固定数组场景 | 动态数据结构 |
总结
std::array<T, N>
是定长、栈分配、安全封装的数组类型;- 是原生数组的现代替代品,适合 性能敏感且长度固定 的应用场景;
- 使用 STL 算法、迭代器、
at()
安全访问等方式更加方便和安全; - 不能替代
std::vector
用于动态扩容场景。