题目

编写程序,演示现代 C++ 中用于全面替代 C 语言原生数组的固定容量容器 std::array<T, N>。展示其完全分配在栈上的零堆开销特性,原生支持按值拷贝传递(解决 C 数组退化为指针的隐患);比对 operator[] 零开销访问与 at(index) 提供带边界检查并在越界时抛出 std::out_of_range 异常的安全防御。

输入格式:无需外部输入。

输出格式:输出 std::array 内存占用、STL 算法兼容性与越界异常捕获信息。

数据范围与约定:C++11 静态固定容器与类型安全。

思路与算法

1. 解决 C 原生数组退化指针缺陷
C 数组作为函数实参传递时会静默退化为裸指针 int*,丢失数组长度信息。std::array<int, 5> 是完备的对象,拥有 size(),可按值或引用传参,完全保留类型与维度信息。

2. 零运行时开销抽象
std::array 内部就是一个简单的原生数组包裹体 T elements[N],对象本身大小就是 sizeof(T) * N,无任何虚函数表或动态指针开销。

3. at 与 operator[] 的取舍
operator[] 追求极致性能,不执行边界检查;at() 在关键业务逻辑或调试阶段提供强有力的安全兜底。

完整程序

#include <iostream>
#include <array>
#include <algorithm>
#include <stdexcept>

void printArray(const std::array<int, 5>& arr) {
    std::cout << "array 容量: " << arr.size() << ",内容: ";
    for (int x : arr) std::cout << x << " ";
    std::cout << "\n";
}

int main() {
    // 1. 栈上就地构造,完全零堆分配
    std::array<int, 5> data = {40, 10, 50, 20, 30};
    std::cout << "std::array<int, 5> 占用空间大小: " << sizeof(data) << " 字节 (严格等于 5 * sizeof(int))\n";

    // 2. 完美适配 STL 标准算法
    std::sort(data.begin(), data.end());
    printArray(data);

    // 3. at() 边界检查与异常捕获
    std::cout << "\n--- 越界安全防护测试 ---\n";
    try {
        std::cout << "访问下标 2: " << data.at(2) << "\n";
        std::cout << "尝试访问越界下标 10...\n";
        int val = data.at(10); // 触发越界异常
        std::cout << "该行不会执行: " << val << "\n";
    } catch (const std::out_of_range& e) {
        std::cout << "【捕获异常】成功拦截 std::out_of_range\n";
        (void)e;
    }

    return 0;
}

运行示例

输出:

std::array<int, 5> 占用空间大小: 20 字节 (严格等于 5 * sizeof(int))
array 容量: 5,内容: 10 20 30 40 50 

--- 越界安全防护测试 ---
访问下标 2: 30
尝试访问越界下标 10...
【捕获异常】成功拦截 std::out_of_range