不会。reserve()只改变capacity()而不影响size(),预留空间未构造对象,不能直接下标访问;resize()则会调整size()并构造元素。

reserve() 会改变 vector 的 size 吗?
不会。reserve() 只影响 capacity(),不改变 size()。调用后 size() 仍是 0(或原有元素个数),不能直接通过下标访问新预留的空间——那部分内存尚未构造对象。
常见错误是以为 v.reserve(100); v[50] = 42; 合法,实际触发未定义行为(越界写入)。正确做法是先用 push_back()、emplace_back() 或 resize() 构造元素。
reserve() 和 resize() 的关键区别
reserve() 是纯内存预分配,不调用元素构造函数;resize() 会调整 size(),对新增元素执行默认构造(或指定值初始化)。
- 需要后续逐个填入数据 → 用
reserve()+push_back() - 需要立即拥有 N 个默认构造的对象 → 用
resize(N) - 想预分配且同时初始化 N 个副本 →
vector<t>(N, value)</t>构造更直接
例如:读取未知长度的文件行,预估最多 1000 行:
std::vector<std::string> lines;<br>lines.reserve(1000); // 避免多次 realloc<br>std::string line;<br>while (std::getline(in, line)) {<br> lines.push_back(std::move(line)); // 此时才真正构造 string 对象<br>}
立即学习“C++免费学习笔记(深入)”;
reserve() 调用时机和性能影响
在明确知道最终容量上限时尽早调用,最好在插入任何元素前。重复调用 reserve() 可能导致不必要的内存释放+重分配(尤其当新容量小于当前 capacity() 时,标准不强制释放,但某些实现会)。
- 已知要塞 5000 个 int →
v.reserve(5000)在循环前调用一次 - 边插入边猜大小(如每次翻倍)→ 不如用
std::vector默认增长策略,手动 reserve 反而可能降低效率 - 调用
reserve(N)后又clear(),capacity()通常不变,内存未释放
注意:如果 T 是非平凡类型(有自定义构造/析构),reserve() 不会调用任何构造函数,因此无额外开销;但若误用 resize() 替代,会白花 O(N) 构造/析构成本。
reserve() 后 capacity() 一定等于参数值吗?
不一定。标准只要求 capacity() >= 参数值。实现可能向上对齐到内存页边界或内部块大小(如 16、32 的倍数),尤其在小尺寸时。所以不能假设 v.capacity() == 100 即使调用了 v.reserve(100)。
验证方式始终用 v.capacity(),而不是依赖传入值。另外,shrink_to_fit() 是唯一能提示释放多余容量的接口,但它不保证成功,也不改变 size()。
容易被忽略的是:对空 vector 调用 reserve(0) 是合法但无意义的操作;而对已含元素的容器,reserve() 小于当前 size() 会被忽略(C++11 起)。


















