vector初始化常见错误是误写vector arr(3,5),正确应为vector arr(3,vector(5));嵌套vector非连续内存,高频计算宜用一维模拟;拷贝为深拷贝,移动后原对象仅size()可用。

vector> 初始化时常见错误
直接写 vector 会编译失败——vector 构造函数不接受这种参数组合。第二个参数必须是同类型的对象,而 5 是 int,不是 vector。
正确做法是显式构造内层 vector:
-
vector:创建 3 行、每行 5 个> arr(3, vector (5)) 0的二维数组 -
vector:每行 5 个> arr(3, vector (5, 7)) 7 - 如果行、列尺寸在运行时才确定,不能用初始化列表,得先声明再 resize:
vector> arr; arr.resize(m, vector (n, 0));
用 initializer_list 初始化嵌套 vector(C++11 起)
适合小规模、编译期已知数据的场景,比如测试用例或常量表。语法直观但性能不优,别在循环里反复用。
示例:
立即学习“C++免费学习笔记(深入)”;
vector> mat = { {1, 2, 3}, {4, 5}, {6, 7, 8, 9} };
注意:mat[1] 长度是 2,mat[2] 是 4 —— 它不是严格矩形,而是“vector of vectors”,每行可独立变长。
- 若需要严格矩形且初始化全为 0,仍推荐
vector>(m, vector (n)) - 混合使用 initializer_list 和默认值会报错:
{ {1,2}, vector不合法,类型不一致(3) }
避免 vector> 的性能陷阱
它在内存中不是连续布局,每行 vector 单独分配堆内存,缓存不友好,访问速度远低于一维模拟二维(如 vector)。
- 高频数值计算(如图像处理、矩阵运算)优先用一维 + 手动索引:
data[i * cols + j] - 若必须用嵌套 vector,确保外层 size 固定后不再 push_back,否则可能触发多次内存重分配
- 初始化后调用
shrink_to_fit()对每行没实际意义,因为vector内部 capacity 通常已紧凑
赋值与深拷贝行为
vector 的拷贝是深拷贝:新对象拥有完全独立的数据副本,修改副本不影响原对象。
但要注意引用语义误用:
-
auto& row = mat[0];→ 修改row会改mat[0] -
auto row = mat[0];→ 这是拷贝,后续改row不影响mat - 想实现“视图”或共享数据?该用
span(C++20)或裸指针+长度,而不是靠 vector 拷贝>
真正容易被忽略的是:嵌套 vector 的移动语义虽高效,但移动后原对象处于有效但未定义状态,不能再读取其 size() 以外的成员——这点比普通 vector 更易出错。










