You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ vector数组剩余位置补0方法及std::array与原生数组的区别

问题1:初始化std::array内所有vector为大小10的全0序列的实现

实现逻辑很简单,定义array后遍历每个元素,调用resize方法将每个vector的长度设为10、默认填充值为0即可,后续直接通过下标或者at()方法赋值,不需要再使用push_back。完整实现代码如下:

#include <bits/stdc++.h>
using namespace std;

int main() {   
    array<vector<int>,10> arr1;
    // 遍历初始化每个vector为长度10、全0的序列
    for (auto& vec : arr1) {
        vec.resize(10, 0);
    }

    // 直接通过下标赋值,不需要push_back
    // 也可以用arr1.at(0).at(0) = 1 开启边界检查,越界会抛出异常方便调试
    arr1[0][0] = 1;
    arr1[0][1] = 2;
    arr1[0][2] = 3;
    arr1[1][0] = 4;
    arr1[1][1] = 5;
    arr1[2][0] = 6;
    arr1[7][0] = 100;

    // 输出每行固定10个数值,未修改位置默认保留0
    for (const auto& i : arr1) {
        for (auto j : i) {
            cout << j << " ";
        }
        cout << "\n";
    }
    return 0;
}
问题2:array<vector<int>,10> arr;和vector<int> arr[10];的区别

两者的核心差异如下:

  • 类型属性不同:前者是STL提供的std::array容器类型,属于C标准库的容器范畴;后者是C/C原生的固定长度数组,属于内置基础类型。
  • 内置能力不同:std::array支持所有STL容器通用的成员方法,比如at()(带边界检查的下标访问)、size()(获取元素数量)、empty()(判空)、begin()/end()迭代器、swap()快速交换等;原生数组没有任何内置成员方法,只能通过裸指针操作,数组长度需要开发者手动维护。
  • 语法特性不同:std::array支持整体赋值、值传递、作为函数返回值直接返回;原生数组无法整体赋值,作为参数传递时会隐式退化为指针,丢失数组长度信息,很容易引发越界错误。
  • 安全等级不同:std::array的at()方法访问越界时会主动抛出std::out_of_range异常,便于快速定位问题;原生数组的下标访问越界属于未定义行为,可能出现直接崩溃、脏数据等随机问题,排查难度很高。

内容的提问来源于stack exchange,提问作者Zero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:57:00