reserve不改变size只影响capacity,它预先分配至少指定大小的内存但不构造元素,因此size不变而capacity≥请求值,错误访问未构造位置会导致未定义行为。
reserve 的作用是提前为 vector 的内部动态数组分配至少指定大小的内存,但它**不会构造任何元素**,因此调用后 vector::size() 不变,vector::capacity() 会 ≥ 请求值。常见误解是以为 reserve(n) 后就能直接访问 v[0] 到 v[n-1] —— 实际会越界,因为这些位置根本没被构造。
典型误用场景:
v.reserve(10); v[5] = 42; → 未定义行为(UB)resize() 混用,比如先 reserve 再循环 push_back 却没检查是否真需要扩容只有在你能预估最终元素数量、且后续操作以 push_back 为主时,reserve 才有明确收益。例如读取文件行数已知、解析固定长度数组、批量生成对象等。
关键判断点:
reserve 可能浪费内存或起反作用insert 在中间插入,reserve 对整体性能帮助有限,因为移动成本仍在int)效果明显;对大对象(含深拷贝的类),避免多次 realloc + copy 的收益更突出示例:读取 1000 行文本前调用 v.reserve(1000),可避免 vector 多次按 1.5 倍增长导致的 7–10 次内存重分配与元素拷贝。
reserve(n) 是“我打算塞最多 n 个,你先把地圈好”;resize(n) 是“我

常见混淆表现:
int,写了 v.reserve(100) → 结果 v.size() == 0,遍历时直接崩溃v.resize(100) 或 v.assign(100, 0)
v.reserve(100); v.resize(100),但注意 resize 可能触发默认构造(对无默认构造函数的类型不适用)最安全的调用点是在所有元素插入开始前、且数量可预测时。但要注意几个隐性坑:
reserve 不保证只分配一次 —— 如果请求容量小于当前 capacity,它可能什么也不做;但如果系统内存碎片严重,即使满足请求也可能触发新分配shrink_to_fit() 后再 reserve,某些 STL 实现会多一次释放+重分配reserve 本身是线程安全的(不修改元素),但若其他线程同时 push_back,仍需同步vector,reserve 行为依赖分配器实现,未必完全按预期增长真正容易被忽略的是:reserve 解决不了迭代器失效问题。只要发生 reallocation(包括由 reserve 主动触发的那次),原有迭代器、指针、引用全部失效 —— 这点和 resize 不同,后者在不扩容时保持有效性。