最常用且最安全的二维vector初始化方式是用外层vector构造函数传入行数、内层vector构造函数指定列数和默认值,如vector(4, vector(5, 0));需注意外层第二参数必须是已构造对象,不可省略初始值或写错类型。

直接用构造函数初始化固定行列
最常用也最安全的方式,就是用外层 vector 的构造函数传入行数,再用内层 vector 构造函数指定每行列数和默认值。比如创建一个 4 行 5 列、全为 0 的矩阵:
vector<vector>> mat(4, vector<int>(5, 0));</int></vector>
这里关键点是:外层 vector 的第二个参数必须是一个已构造好的 vector<int></int> 对象(不是类型),它会被拷贝 4 次,形成 4 行。
- 如果省略初始值(如
vector<int>(5)</int>),元素值是未定义的(对int通常是 0,但不保证;对自定义类型可能调用默认构造) - 若需要非零初始值(如 -1),必须显式写出:
vector<int>(5, -1)</int> - 不能写成
vector<vector>> mat(4, 5)</vector>—— 编译失败,类型不匹配
用 resize() 分步设置大小
适合运行时才知道尺寸、或需要复用已有 vector 变量的场景。先调 resize() 设行数,再对每一行单独 resize() 列数:
vector<vector>> mat;<br>mat.resize(4); // 设 4 行,此时每行都是空 vector<br>for (int i = 0; i mat[i].resize(5, 0); // 每行设 5 列,填 0<br>}</vector>
注意:必须先 mat.resize(4),否则 mat[0] 访问越界;也不能跳过循环直接写 mat[0].resize(5),因为 mat[0] 还不存在。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 如果后续要频繁 push_back 元素,建议在
resize()后再对每行调用reserve()避免重复扩容 -
resize()会调用元素的默认构造(对int是 0),而reserve()只预分配内存、不构造对象
初始化后访问 [i][j] 报错或值异常?检查这三点
常见崩溃或读到垃圾值,往往不是初始化写错,而是后续使用踩了坑:
- 误以为
vector<vector>> mat(3, vector<int>(2))</int></vector>创建的是“3×2 矩阵”,其实它是 3 行、每行 2 个元素 —— 但若某行 later 被push_back,就变成不规则了 - 用
mat[i][j] = x前没确认i 且 <code>j ;<code>at()可做边界检查,但性能略低 - 把二维
vector当作 C 风格二维数组传给函数时,别忘了它的内存不是连续的 —— 不能用&mat[0][0]当一维首地址用
一维固定、二维可变的混合初始化
当各行长度不同(如邻接表、稀疏结构),就不能用统一的构造函数初始化所有行:
vector<vector>> graph(6); // 6 个空 vector(顶点 0~5)<br>graph[0] = {1, 2};<br>graph[1] = {0, 3, 4};<br>graph[2] = {0};<br>// ...</vector>
这种写法合法且高效:外层大小固定为 6,每行按需赋值。但要注意:
- 不能写
graph[0].push_back(1)之前不确保graph[0]存在 —— 上面的graph(6)已经构造了 6 个空vector<int></int>,所以安全 - 如果初始化后想清空某一行,用
graph[i].clear(),不是graph[i] = {}(后者效率略低) - 遍历时推荐用范围 for:
for (const auto& row : graph) { ... },避免手动索引越界
vector 的两层内存完全独立,外层 resize(n) 不影响内层任何一行的容量,哪怕你刚用 vector<vector>> mat(n, vector<int>(m))</int></vector> 初始化完 —— 后续任意一行都可能因 push_back 触发自己那行的重新分配。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










