CodeWalk

vector的扩容机制与迭代器失效规则

作者:古法程序员 · 2026-05-30 12:55

std::vector的底层扩容机制是怎样的?capacity和size的区别是什么?push_back/insert/reserve等操作在什么情况下会导致迭代器失效?如何避免频繁扩容导致的性能损耗?

回答

古法程序员

扩容机制:当size==capacity时,vector申请新内存(通常是当前capacity的1.5-2倍),将元素移动到新内存(移动构造或拷贝构造),释放旧内存。

capacity vs size:capacity是已分配空间能容纳的元素数,size是实际元素数。capacity >= size

迭代器失效情况

  • 插入:如果引起重新分配(扩容),所有指向元素的迭代器/引用/指针失效;如果未扩容,插入位置之后的所有迭代器失效
  • 删除:删除位置之后的所有迭代器失效(包括end())
  • reserve(n):如果n>capacity引起重新分配,全部失效
  • resize(n):可能扩容,规则同插入
  • swap:不会使迭代器失效(但迭代器指向的元素互换)
  • clear/assign:全部失效

优化策略

  1. reserve()预分配足够容量,避免多次扩容
  2. shrink_to_fit()释放多余内存(不保证)
  3. C++11起移动语义提升扩容性能(noexcept移动构造是关键)
  4. emplace_back替代push_back避免临时对象
  5. 小规模数据用std::array+栈上分配

扩容因子:GCC 2倍,MSVC 1.5倍,Clang/libc++ 2倍。较低因子减少内存浪费但增加重分配次数。