0
点赞
收藏
分享

微信扫一扫

C++ std::array:固定大小的安全数组容器

C++ std::array:固定大小的安全数组容器

在 C++ 里处理固定长度的数据时,std::array是比传统数组更优的选择。它像一个加了安全锁的固定尺寸收纳盒,既保留了传统数组的高效访问特性,又弥补了其安全性不足的短板 —— 能自动检查越界访问、支持迭代器遍历,还能直接获取容器大小,让数组操作既高效又省心。

std::array的大小在编译时就已确定,这一点和传统数组一致,但它通过类模板封装了更多实用功能。创建std::array时只需指定元素类型和大小,用法和传统数组相近却更灵活:

#include <iostream>
#include <array>
using namespace std;

int main() {
    // 创建一个存储5个整数的array,初始值为0
    array<int, 5> nums{};
    
    // 像传统数组一样赋值
    nums[0] = 10;
    nums[1] = 20;
    nums[2] = 30;
    
    // 用at()访问元素(会做越界检查,更安全)
    nums.at(3) = 40;
    nums.at(4) = 50;
    
    // 直接获取大小(无需像传统数组那样用sizeof计算)
    cout << "array大小:" << nums.size() << endl; // 输出5
    
    // 遍历array的三种方式
    // 1. 普通for循环
    cout << "普通for循环遍历:";
    for (size_t i = 0; i < nums.size(); ++i) {
        cout << nums[i] << " ";
    }
    // 2. 范围for循环
    cout << "\n范围for循环遍历:";
    for (int num : nums) {
        cout << num << " ";
    }
    // 3. 迭代器遍历
    cout << "\n迭代器遍历:";
    for (auto it = nums.begin(); it != nums.end(); ++it) {
        cout << *it << " ";
    }
    // 三种方式均输出:10 20 30 40 50
    
    return 0;
}

std::array的安全性体现在at()方法的越界检查上。传统数组越界访问会触发未定义行为,而std::array::at()会直接抛出out_of_range异常,便于调试:

try {
    // 访问下标5,超出array大小5(下标0-4)
    nums.at(5) = 60;
} catch (const out_of_range& e) {
    cout << "\n越界访问错误:" << e.what() << endl;
    // 输出类似:越界访问错误:array::at: __n (which is 5) >= _Nm (which is 5)
}

在需要传递固定大小数组的场景中,std::array比传统数组更方便。传统数组作为函数参数时会退化为指针,丢失大小信息,而std::array能完整保留大小和类型:

// 接收std::array参数,大小作为模板参数传递
template <size_t Size>
void print_array(const array<int, Size>& arr) {
    cout << "数组内容:";
    for (int num : arr) {
        cout << num << " ";
    }
    cout << "(大小:" << Size << ")" << endl;
}

int main() {
    array<int, 3> small_arr = {1, 2, 3};
    array<int, 5> large_arr = {10, 20, 30, 40, 50};
    
    // 自动匹配模板参数,无需手动传递大小
    print_array(small_arr); // 输出:数组内容:1 2 3 (大小:3)
    print_array(large_arr); // 输出:数组内容:10 20 30 40 50 (大小:5)
    return 0;
}

std::array还支持直接赋值和比较操作,这是传统数组无法做到的。传统数组赋值会触发编译错误,而std::array可以像普通变量一样直接赋值:

array<int, 3> arr1 = {1, 2, 3};
array<int, 3> arr2;

// 直接赋值(传统数组无法这样做)
arr2 = arr1;
cout << "arr2赋值后:";
for (int num : arr2) {
    cout << num << " ";
} // 输出:1 2 3

// 直接比较(按元素逐一比较)
if (arr1 == arr2) {
    cout << "\narr1和arr2相等" << endl;
}

// 修改arr2后再比较
arr2[1] = 20;
if (arr1 != arr2) {
    cout << "arr1和arr2不相等" << endl;
}

在性能上,std::array和传统数组几乎没有差异,因为它在编译时会被优化为类似传统数组的结构,没有额外的内存开销。但它提供的安全性和便捷性,让代码更易维护、更少出错。

从存储固定长度配置数据,到传递已知大小的数值集合,再到实现简单的缓存结构,std::array都能胜任。它既保留了传统数组的高效,又解决了其安全性和易用性的痛点,是 C++ 中处理固定大小数据的理想选择。如果你的场景中数据长度已知且不会变化,试试std::array,它会让数组操作变得更安全、更优雅。

举报

相关推荐

0 条评论