resize()改变元素数量并可能触发扩容,reserve()仅预分配内存不改变大小;前者用于初始化或调整内容长度,后者提升push_back性能避免频繁重分配。

在C++中,vector 是最常用的动态数组容器之一。很多人容易混淆 resize() 和 reserve() 的作用,尽管它们都与容量管理有关,但功能完全不同。理解它们的区别对内存管理和性能优化至关重要。
resize():改变元素数量
resize() 的作用是调整 vector 中实际元素的个数,也就是改变它的 size()。
调用 resize(n) 后:
- 如果 n 大于当前 size,vector 会在末尾添加新元素,使用默认构造函数或指定值填充。
- 如果 n 小于当前 size,vector 会删除末尾多余的元素。
- 这个操作可能触发内存重新分配,也可能不触发,取决于是否超过当前
capacity()。
std::vectorv; v.resize(5); // 现在有5个元素,值为0 // v.size() == 5, v.capacity() >= 5
reserve():预分配内存空间
reserve() 只改变 vector 的容量(capacity),不改变其大小(size)。它预先分配足够的内存,以容纳至少 n 个元素,避免后续插入时频繁扩容。
立即学习“C++免费学习笔记(深入)”;
关键点:
- 不会构造任何新对象,只是申请内存。
- 调用后
size()不变,capacity()至少为 n。 - 减少动态扩容次数,提升性能,尤其在大量 push_back 操作前使用效果明显。
std::vectorv; v.reserve(100); // 预留空间,可存100个int // v.size() == 0, v.capacity() >= 100
性能优化建议
合理使用这两个函数能显著提升程序效率:
- 如果知道将要存储的元素数量,先调用
reserve(),再用push_back()添加数据,避免多次内存拷贝。 - 需要初始化或清空内容时用
resize(),比如准备一个固定长度的缓冲区。 - 频繁扩容是性能杀手,每次扩容通常按比例(如1.5或2倍)增长,旧数据需复制,代价高。
- 过度预留内存(过大的 reserve)会浪费空间,需权衡时间和空间成本。
基本上就这些。掌握 resize 和 reserve 的区别,能让你写出更高效、更可控的 C++ 代码。不复杂但容易忽略。











