std::vector
的扩容机制是 C++ 容器性能优化的一个核心点。它的判断标准、行为特征和实现细节如下所示:
✅ 一、vector 的核心结构
std::vector
内部维护三个指针:
begin -> 指向数据起始位置
end -> 指向当前已使用的元素末尾(size)
capacity_end -> 指向当前分配的内存末尾(capacity)
如果你继续插入元素导致 end == capacity_end
,即当前内存空间不够,就会触发扩容。
✅ 二、什么时候触发扩容?
扩容条件:
当 size() >= capacity() 时,再插入元素,就触发扩容
也就是说:
vector.push_back(x);
如果此时元素个数 == 容量,就会 重新分配更大的内存空间 + 拷贝旧数据过去。
✅ 三、扩容策略(增长规律)
不同编译器略有不同,但通常是:
新容量 = 当前容量 * 1.5 ~ 2
例如:
- 初始容量为 0;
- 插入第一个元素后,可能扩为 1;
- 再插入一个元素,扩为 2;
- 再插入一个,扩为 4;
- 然后扩为 8、16、32…(指数增长)
这是为了避免频繁 realloc(拷贝/移动),提高效率。
✅ 四、如何手动控制扩容
1. reserve(n)
:预留空间但不改变 size
std::vector<int> vec;
vec.reserve(1000); // 分配容量至少为 1000,避免中途多次扩容
2. resize(n)
:修改 size(实际元素个数)
vec.resize(100); // 改变 vector 的 size,会初始化新元素
✅ 五、扩容的代价与注意事项
- 重新分配内存(新的更大的空间);
- 拷贝或移动旧元素到新空间;
- 旧空间释放;
- 所以
vector
的地址在扩容后是可能变化的,原先的指针/引用会失效!
🔴 注意:不要在 vector 扩容后继续使用原先的指针或引用!
✅ 六、示例代码演示
#include <iostream>
#include <vector>int main() {std::vector<int> v;std::cout << "初始 capacity: " << v.capacity() << "\n";for (int i = 0; i < 20; ++i) {v.push_back(i);std::cout << "插入 " << i << ", size: " << v.size() << ", capacity: " << v.capacity() << "\n";}return 0;
}
📌 输出中你将看到:每隔几次 push_back
,capacity
就倍增一次。
✅ 七、总结
项目 | vector 行为说明 |
---|---|
扩容时机 | size >= capacity |
扩容代价 | 重新分配内存 + 拷贝/移动旧元素 |
扩容策略 | 指数增长(一般为 1.5 或 2 倍) |
控制扩容 | reserve(n) 提前分配空间避免多次扩容 |
注意事项 | 扩容后地址可能变化,旧引用/指针可能失效 |