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
相关产品推荐
相关产品推荐

