C++中的array容器详解

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. 性能提示

  1. 访问元素性能与原生数组相同(O(1)O(1)O(1))
  2. 编译时确定大小,没有动态内存分配
  3. at()operator[]稍慢(边界检查)
  4. 适合已知大小的固定集合场景
  5. 比原生数组更安全(提供边界检查等)

11. 与原生数组比较

特性 array 原生数组
大小 编译时固定 编译时固定
边界检查 提供at()方法
赋值 支持整体赋值 不支持
作为参数传递 不会退化为指针 退化为指针
迭代器支持 完整STL迭代器支持
相关推荐
khddvbe6 分钟前
C++并发编程中的死锁避免
开发语言·c++·算法
wWYy.1 小时前
STL:list
开发语言·c++
TON_G-T1 小时前
day.js和 Moment.js
开发语言·javascript·ecmascript
飞Link1 小时前
具身智能核心架构之 Python 行为树 (py_trees) 深度剖析与实战
开发语言·人工智能·python·架构
小比特_蓝光2 小时前
vector模拟实现
c++
码云数智-园园2 小时前
2026 年前端开发趋势:AI 赋能、组件化与跨端一体化的深度融合
开发语言
咱就是说不配啊2 小时前
3.19打卡day33
数据结构·c++·算法
weixin_423533992 小时前
windows11安装飞桨paddlepaddle,python3.13
开发语言
2501_924952692 小时前
嵌入式C++电源管理
开发语言·c++·算法
2401_842623652 小时前
C++中的访问者模式高级应用
开发语言·c++·算法