当向 std::vector 添加新元素(如使用 push_back())而当前容量(capacity)不足时,会触发以下机制:
容量计算:容器会分配一块新的、更大的内存空间。新容量的计算遵循几何增长策略(通常为旧容量的 2 倍)。这种策略是关键,它确保了多次
push_back操作的分摊时间复杂度为 O(1),尽管单次扩容本身是 O(n) 的操作。元素迁移:将所有现有元素从旧内存空间移动或拷贝到新分配的空间中。
资源释放:随后,原有的内存空间被释放。
迭代器失效:最重要的是,任何指向旧内存空间的迭代器、指针和引用都会失效。这是使用
std::vector时最需要警惕的地方。
代码示例
#include <iostream>
#include <vector>
void Record(std::vector<int>& v) {
std::cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << std::endl;
}
int main() {
std::vector<int> v;
int current_capacity = v.capacity();
Record(v);
for (int i = 0; i < 50; ++i) {
v.push_back(i);
if (v.capacity() != current_capacity) {
Record(v);
current_capacity = v.capacity();
}
}
return 0;
}Output:

优化
如果事先知道元素的大致数量,应使用 reserve() 预先分配足够容量,避免多次不必要的扩容操作。
vector 插入10000个数字,怎么保证性能较高?
reserve(10000)
在这个 vector 中删除偶数位置的数,怎么保证性能较高?
如果一次次调用 pop_back(),每一次都是 O(n) 的时间复杂度。
只需一次遍历,手动将需要留下的元素都移动到前面,再 resize(5000)。
评论区