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迭代器支持
相关推荐
爱敲代码的憨仔13 分钟前
BM25全文检索
开发语言·python·全文检索
油丶酸萝卜别吃6 小时前
utils.js 说明文档
开发语言·javascript·ecmascript
leisoo80979 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
不会代码的小猴9 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
青瓦梦滋10 小时前
传输层UDP/TCP协议
linux·网络·c++·网络协议·tcp/ip·udp
一只旭宝10 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
coder!mq12 小时前
说几个常见的语法糖?
java·开发语言·算法
gugucoding12 小时前
38. 【Java】Stream API(下):高级操作与性能
java·开发语言
Lhan.zzZ12 小时前
在 Visual Studio 2022 中打造可扩展的动态链接库模块:从零搭建到原理解析
开发语言·c++·visual studio
心平气和量大福大13 小时前
android-实例-蒲公英-更新与安装-5-签名与生成APK
android·java·开发语言