vector v(3, 5)错误,因无int→vector隐式转换;正确为vector v(3, vector(5))或vector v(3, vector(5, 7));动态尺寸用resize()优于push_back();不规则数组需逐行构造;拷贝宜用move避免开销。

vector> 初始化时别直接用 vector<vector>> v(3, 5)</vector>
vector<vector>> v(3, 5)</vector>这行代码不会创建 3×5 的二维数组,而是试图构造 3 个元素,每个元素是 vector<int>(5)</int> —— 但编译会失败,因为 vector<int></int> 没有从 int(5)隐式构造的单参数构造函数。常见错误现象是报错:no matching constructor 或 cannot convert int to vector<int></int>。
正确做法是显式写出内层 vector 的构造:
vector<vector>> v(3, vector<int>(5)); // 3 行 × 5 列,全 0</int></vector>
如果想初始化为特定值,比如全 7:
vector<vector>> v(3, vector<int>(5, 7)); // 每个 inner vector 含 5 个 7</int></vector>
-
vector<vector>> rows, cols</vector>的两个参数分别控制外层大小和每个内层 vector 的初始状态 - 内层
vector<int>(5, 7)</int>是拷贝构造的“模板”,所有 3 行都共享同一份初始化逻辑(不是同一对象) - 这种初始化方式在栈上分配外层结构,堆上分配每行内存,性能可接受,但不适合超大矩阵(考虑
vector连续存储优势丧失)
动态推导尺寸时优先用 resize() 而非重复 push_back()
当行数、列数运行时才确定(比如读文件、用户输入),先声明空容器再批量调整尺寸,比循环 push_back(vector<int>(cols))</int> 更高效且语义清晰。
例如:读入 m 行 n 列整数数据:
int m = 3, n = 4;<br>vector<vector>> grid;<br>grid.resize(m, vector<int>(n)); // 直接铺好 m 行 n 列</int></vector>
-
resize()会调用默认构造或指定值填充新元素,避免多次内存重分配 - 若后续要逐行填值,直接用
grid[i][j] = x即可,下标安全(前提是已resize或reserve) - 误用
push_back()循环构造会导致 m 次堆分配 + 潜在拷贝,尤其内层 vector 较大时明显变慢
需要“不规则二维数组”?别硬套 vector<vector>></vector> 初始化语法
比如每行长度不同(三角阵、稀疏行),vector<vector>>(rows, vector<int>(cols))</int></vector> 就完全不适用——它强制所有行等长。
此时应分两步:先定外层数量,再逐行独立构造:
vector<vector>> jagged = {{1}, {2, 3}, {4, 5, 6}}; // 初始化列表(C++11+)<br>// 或运行时:<br>vector<vector>> v;<br>v.reserve(3);<br>v.push_back({10});<br>v.push_back({20, 21, 22});<br>v.push_back({30, 31});</vector></vector>
- 用初始化列表最简洁,但要求编译期知道每行内容
- 运行时构造推荐先
reserve()外层容量,减少 vector 自身扩容开销 - 注意:
v[i].size()必须每次检查,不能假设统一列数;越界访问(如v[0][5])仍是未定义行为
赋值和拷贝要注意深浅层次
vector<vector>></vector> 的拷贝是深拷贝:外层 vector 和每个内层 vector 都独立复制。但如果你写成 v = w,看起来简单,实际可能触发多次内存分配和拷贝。
常见低效写法:
vector<vector>> src = {{1,2}, {3,4}};<br>vector<vector>> dst;<br>dst = src; // ✅ 正确但可能不必要地重分配</vector></vector>
更优做法(C++11+):
dst = move(src); // 把 src 置为空,避免拷贝开销<br>// 或直接初始化:<br>vector<vector>> dst = move(src);</vector>
- 移动赋值后
src处于有效但未指定状态(通常为空),不能再读取其内容 - 如果只是临时传参,考虑用
const vector<vector>>&</vector>引用避免拷贝 - 切勿返回局部
vector<vector>></vector>的引用——那是悬垂引用
嵌套 vector 的边界检查、内存布局、拷贝成本比一维高得多,初始化和赋值时多看一眼构造函数签名,比事后调试越界或性能抖动省力得多。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!









