C++中的array容器详解
1. array概述
array是C++11引入的固定大小数组容器,提供类似原生数组的功能但更安全,包含STL容器的接口特性。它在栈上分配内存,大小在编译时确定。
2. 基本特性
- 固定大小:创建后不能改变容量
- 连续存储:元素在内存中连续存放
- 随机访问:支持下标操作和迭代器访问
- 安全边界检查 :提供
at()方法进行边界检查 - STL兼容:支持STL算法和迭代器
3. 头文件与声明
cpp
#include <array>
using namespace std;
array<int, 5> arr1; // 5个未初始化的int
array<string, 3> arr2{}; // 3个默认构造的string(空字符串)
array<double, 4> arr3 = {1.1, 2.2}; // 前两个初始化,后两个为0.0
array<char, 6> arr4{'a', 'b', 'c'}; // 初始化列表
4. 构造函数与初始化
4.1 默认构造
cpp
array<int, 5> arr; // 元素值未定义(可能为随机值)
4.2 聚合初始化
cpp
array<int, 3> arr = {1, 2, 3}; // 完全初始化
array<int, 5> arr = {1, 2}; // 部分初始化,剩余为0
4.3 拷贝构造
cpp
array<int, 4> arr1 = {1, 2, 3, 4};
array<int, 4> arr2(arr1); // 拷贝构造
array<int, 4> arr3 = arr1; // 拷贝赋值
5. 容量操作
5.1 size()
cpp
cout << arr.size(); // 返回元素数量(编译时常量)
5.2 empty()
cpp
if(arr.empty()) { // 对于array总是返回false
cout << "Array is empty";
}
5.3 max_size()
cpp
cout << arr.max_size(); // 返回容量(等于size())
6. 元素访问
6.1 operator[]
cpp
arr[2] = 10; // 修改第3个元素
int val = arr[1]; // 访问第2个元素
6.2 at()
cpp
arr.at(3) = 20; // 修改第4个元素(边界检查)
try {
int val = arr.at(10); // 抛出std::out_of_range异常
} catch(const out_of_range& e) {
cerr << e.what() << endl;
}
6.3 front()
cpp
arr.front() = 5; // 修改第一个元素
int first = arr.front(); // 访问第一个元素
6.4 back()
cpp
arr.back() = 8; // 修改最后一个元素
int last = arr.back(); // 访问最后一个元素
6.5 data()
cpp
int* p = arr.data(); // 获取指向底层数组的指针
*p = 100; // 修改第一个元素
7. 修改操作
7.1 fill()
cpp
arr.fill(42); // 将所有元素设置为42
7.2 swap()
cpp
array<int, 4> arr2 = {5, 6, 7, 8};
arr.swap(arr2); // 交换两个array的内容
8. 迭代器
8.1 begin() & end()
cpp
for(auto it = arr.begin(); it != arr.end(); ++it) {
cout << *it << " ";
}
8.2 rbegin() & rend()
cpp
for(auto rit = arr.rbegin(); rit != arr.rend(); ++rit) {
cout << *rit << " "; // 反向遍历
}
8.3 cbegin() & cend()
cpp
for(auto it = arr.cbegin(); it != arr.cend(); ++it) {
// *it = 10; // 错误: 不能修改const迭代器指向的值
cout << *it << " ";
}
9. 完整示例
cpp
#include <iostream>
#include <array>
#include <algorithm>
using namespace std;
int main() {
// 创建并初始化array
array<int, 6> arr = {2, 3, 1, 7, 5, 4};
// 访问元素
cout << "First element: " << arr.front() << endl;
cout << "Last element: " << arr.back() << endl;
cout << "Element at index 2: " << arr.at(2) << endl;
// 修改元素
arr[3] = 10;
arr.at(4) = 20;
// 遍历array
cout << "All elements: ";
for(int num : arr) {
cout << num << " ";
}
cout << endl;
// 使用STL算法
sort(arr.begin(), arr.end());
cout << "Sorted array: ";
copy(arr.begin(), arr.end(), ostream_iterator<int>(cout, " "));
cout << endl;
// 填充array
arr.fill(0);
cout << "After fill: ";
for(int num : arr) {
cout << num << " ";
}
cout << endl;
// 容量信息
cout << "Size: " << arr.size() << endl;
cout << "Is empty: " << (arr.empty() ? "Yes" : "No") << endl;
cout << "Max size: " << arr.max_size() << endl;
return 0;
}
10. 性能提示
- 访问元素性能与原生数组相同(O(1)O(1)O(1))
- 编译时确定大小,没有动态内存分配
at()比operator[]稍慢(边界检查)- 适合已知大小的固定集合场景
- 比原生数组更安全(提供边界检查等)
11. 与原生数组比较
| 特性 | array |
原生数组 |
|---|---|---|
| 大小 | 编译时固定 | 编译时固定 |
| 边界检查 | 提供at()方法 |
无 |
| 赋值 | 支持整体赋值 | 不支持 |
| 作为参数传递 | 不会退化为指针 | 退化为指针 |
| 迭代器支持 | 完整STL迭代器支持 | 无 |