二维vector本质是vector的每个元素为vector,需明确内层类型和维度逻辑;声明m行n列全0矩阵应写为vector(m, vector(n, 0)),不可用vector(m, n)。

二维 vector 本质是 vector 的每个元素本身也是一个 vector,不是“真正的二维数组”,但能模拟其行为。定义前必须明确内层类型和维度逻辑,否则容易出现越界或初始化混乱。
如何声明并初始化固定大小的二维 vector
最常见需求:创建 m 行 n 列、所有元素为 0 的二维 vector。
- 写法:
vector—— 先构造一个含 n 个 0 的行向量,再复制 m 份> mat(m, vector (n, 0)); - 错误写法:
vector会编译失败,因为> mat(m, n); vector构造函数不接受两个整数参数这样用 - 如果只写
vector,则只分配了 m 个空的> mat(m); vector,访问mat[i][j]前必须先对mat[i]调用resize()或push_back()
如何动态添加行和列(push\_back 嵌套)
适合读入不规则数据(如每行长度不同)或边计算边扩展的场景。
- 先声明空容器:
vector> mat; - 添加一行:
mat.push_back({1, 2, 3});或mat.push_back(vector{1, 2, 3}); - 往某行末尾加元素:
mat[i].push_back(x);,注意确保i - 不能直接写
mat[i].push_back(x)当i >= mat.size(),会越界;应先用mat.resize()或循环push_back空行
访问与遍历时常见的越界陷阱
mat[i][j] 看似简单,但两层下标都需独立校验。
立即学习“C++免费学习笔记(深入)”;
- 常见错误:假设
mat是矩形,直接写for (int i = 0; i —— 若某行为空(mat[i].empty()),mat[0].size()就不适用 - 安全写法:外层判断
i ,内层每次用mat[i].size(),例如for (int j = 0; j - 使用
at()可触发异常:mat.at(i).at(j),调试时比[]更早暴露问题 - 迭代器嵌套写法更泛用:
for (auto& row : mat) for (auto& x : row) ...
性能与内存布局注意事项
二维 vector 的内存不是连续的,每行单独分配,这对缓存友好性和大规模数值计算有影响。
- 若需要高性能访问(如图像处理、矩阵运算),优先考虑一维
vector模拟二维:vector,用flat(m * n); flat[i * n + j]访问 -
vector的拷贝开销大,传递时尽量用 const 引用:> const vector>& mat - 清空全部内容用
mat.clear()即可,不需要手动遍历每行clear()—— 外层clear()会自动析构所有内层vector
真正麻烦的不是语法,而是搞清哪一层负责控制“行数”、哪一层控制“列数”,以及每次操作是否隐式依赖了某一层已初始化。尤其在函数传参、返回值、resize 交错使用时,很容易漏掉某一层的边界检查。











