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迭代器支持
相关推荐
为何创造硅基生物2 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好2 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
星寂樱易李2 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
仰泳之鹅2 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆2 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
于小猿Sup3 小时前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶
cen__y4 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
社交怪人4 小时前
【算平均分】信息学奥赛一本通C语言解法(题号2071)
c语言·开发语言
郭涤生5 小时前
不同主机之间网络通信-以太网连接复习
开发语言·rk3588