目 录CONTENT

文章目录

C++ std::vector 扩容机制

TalentQ
2025-09-10 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

当向 std::vector 添加新元素(如使用 push_back())而当前容量(capacity)不足时,会触发以下机制:

  1. 容量计算:容器会分配一块新的、更大的内存空间。新容量的计算遵循几何增长策略(通常为旧容量的 2 倍)。这种策略是关键,它确保了多次 push_back 操作的分摊时间复杂度为 O(1),尽管单次扩容本身是 O(n) 的操作。

  2. 元素迁移:将所有现有元素从旧内存空间移动或拷贝到新分配的空间中。

  3. 资源释放:随后,原有的内存空间被释放。

  4. 迭代器失效:最重要的是,任何指向旧内存空间的迭代器、指针和引用都会失效。这是使用 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)。

0

评论区