C++ 中的静态数组 std::array
目录
1. 什么是 std::array?
2. 基本用法
3. 主要特点
4. 常用操作示例
5. 优点
1. 什么是 std::array?
std::array 是一个模板类,定义在 <array> 头文件中。它是一个固定大小的数组,封装了 C 风格数组(例如 int arr[5]),但提供了更多的功能和安全性。它的主要特点是:
-
大小在编译时确定:不像 std::vector,std::array 的大小是固定的,无法在运行时动态改变。
-
与 STL 兼容:它支持标准模板库(STL)的接口,例如迭代器、算法等。
-
没有额外的内存开销:它的实现与普通数组一样高效,存储在栈上(而不是堆上)。
2. 基本用法
你需要包含 <array> 头文件来使用它。以下是一个简单的例子:
#include <iostream>
#include <array>
int main() {
// 定义一个大小为5的int类型数组
std::array<int, 5> arr = {1, 2, 3, 4, 5};
// 输出数组元素
for (int i = 0; i < arr.size(); i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
return 0;
}
3. 主要特点
(1) 固定大小
std::array 的大小在定义时通过模板参数指定,例如 std::array<int, 5> 表示一个包含 5 个 int 的数组。大小必须是编译时常量。
(2) 访问元素
-
通过索引:使用 arr[index] 或 at(index)。
-
arr[index]:普通索引访问,不检查边界。
-
arr.at(index):带边界检查,如果越界会抛出 std::out_of_range 异常。
-
-
其他方法:
-
front():返回第一个元素。
-
back():返回最后一个元素。
-
(3) 大小查询
-
size():返回数组元素个数。
-
empty():检查数组是否为空(对于 std::array 总是返回 false,因为大小固定)。
-
max_size():返回数组的最大可能大小(等于 size())。
(4) 初始化
-
可以用初始化列表:std::array<int, 3> arr = {1, 2, 3};
-
如果初始化的元素少于数组大小,未指定的元素会被自动初始化为默认值(例如 0 对于 int):
std::array<int, 5> arr = {1, 2}; // 等价于 {1, 2, 0, 0, 0}
(5) 与 C 风格数组的对比
特性 | std::array | C 风格数组(如 int arr[5] ) |
---|---|---|
大小是否固定 | 是 | 是 |
边界检查 | 支持(通过 at() ) | 无 |
STL 兼容性 | 是 | 否 |
内存分配 | 栈上 | 栈上 |
是否知道自己大小 | 是( size() ) | 否(需手动跟踪) |
4. 常用操作示例
以下是一些常见的操作代码:
#include <iostream>
#include <array>
int main() {
// 定义并初始化
std::array<int, 4> arr = {10, 20, 30, 40};
// 访问元素
std::cout << "第一个元素: " << arr.front() << std::endl; // 10
std::cout << "最后一个元素: " << arr.back() << std::endl; // 40
std::cout << "索引2的元素: " << arr[2] << std::endl; // 30
// 大小
std::cout << "数组大小: " << arr.size() << std::endl; // 4
// 使用迭代器遍历
std::cout << "所有元素: ";
for (auto it = arr.begin(); it != arr.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// 修改元素
arr[1] = 50;
std::cout << "修改后索引1: " << arr[1] << std::endl; // 50
return 0;
}
5. 优点
-
安全性:提供边界检查(通过 at()),避免缓冲区溢出。
-
现代化:与 STL 容器兼容,可以直接用于算法(如 std::sort、std::find)。
-
高效:没有动态内存分配,性能与 C 风格数组相当。
6. 局限性
-
固定大小:无法动态调整大小。如果你需要动态大小的数组,可以使用 std::vector。
-
栈上分配:如果数组太大,可能导致栈溢出。