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

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









