vector默认构造不分配内存,指针为nullptr,size和capacity均为0;访问operator[]或at()会未定义行为;适合后续push_back动态增长,避免初始开销。

vector 默认构造函数不分配内存
调用 std::vector 时,内部指针为 nullptr,size() 和 capacity() 都是 0。此时访问 operator[] 或 at() 会触发未定义行为,不是“空数组”,而是“尚未分配任何缓冲区”。
- 适合后续用
push_back()动态增长,避免初始内存开销 - 若已知大致规模,建议改用带容量的构造:
vector或(0, 0) vector().reserve(n) - 注意:
vector和v{}; vector效果相同,都是默认构造v;
用 n 个相同值初始化 vector
vector 是最常用的显式初始化方式,底层会直接分配 n 个元素空间并逐个拷贝/移动 value。
-
n为 0 时等价于默认构造,但会调用一次T()(若T有默认构造)来生成占位值 - 若
T不可拷贝(如含unique_ptr),且value是右值,可能触发移动构造,效率更高 - 错误写法:
vector创建的是 5 个值为 10 的 int,不是“容量为 5、初始值 10”的容器(5, 10)
用迭代器范围初始化 vector
vector(first, last) 从两个迭代器之间复制元素,类型必须可转换为 T,且 first 和 last 应来自同一容器或兼容范围。
- 常见用途:复制另一个
vector的子段:vectorv2(v1.begin() + 2, v1.end()) - 支持 C 风格数组:
int arr[] = {1,2,3}; vectorv(arr, arr + 3); - 陷阱:若
last不是first的有效后续位置(比如越界或跨容器),行为未定义 - 注意:该构造不会复用原容器的 capacity,新
vector的capacity()至少等于distance(first, last),但可能更大
用 initializer_list 初始化 vector(C++11 起)
vector 本质调用 vector(initializer_list 构造函数,语法简洁,但隐含一次堆分配。
立即学习“C++免费学习笔记(深入)”;
- 编译期确定元素个数,适用于小规模、字面量初始化场景
- 不能混类型:
vector中{1, 2.5f, 3} 1和3会被隐式转为double,但若T是自定义类型且无对应构造函数,会编译失败 - 性能上:比
vector多一次临时(n, value) initializer_list构造和析构,对大列表不推荐 - 不可用于模板推导上下文:
auto v = {1,2,3};推出的是std::initializer_list,不是vector
reserve() 的区别——前者真·零内存,后者只是预留但不构造对象。









