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迭代器支持
相关推荐
j445566112 分钟前
C++中的职责链模式高级应用
开发语言·c++·算法
Hello World . .4 分钟前
数据结构:栈和队列
c语言·开发语言·数据结构·vim
jjjava2.09 分钟前
深入解析Set与Map的奥秘
java·开发语言
白宇横流学长15 分钟前
基于Java的火车票订票系统的设计与开发
java·开发语言
黎雁·泠崖15 分钟前
Java核心基础API学习总结:从Object到包装类的核心知识体系
java·开发语言·学习
WarmSword21 分钟前
mac上用cursor/vscode调试root权限进程
c++·ide·vscode·macos·mac
m0_7369191032 分钟前
模板元编程性能分析
开发语言·c++·算法
Terio_my35 分钟前
简要 Java 面试题学习
java·开发语言·学习
wbs_scy1 小时前
C++11:类新功能、lambda与包装器实战
开发语言·c++
永远睡不够的入1 小时前
类和对象(中)
c++