vector的扩容机制与迭代器失效规则
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:全部失效
优化策略:
reserve()预分配足够容量,避免多次扩容shrink_to_fit()释放多余内存(不保证)- C++11起移动语义提升扩容性能(noexcept移动构造是关键)
emplace_back替代push_back避免临时对象- 小规模数据用
std::array+栈上分配
扩容因子:GCC 2倍,MSVC 1.5倍,Clang/libc++ 2倍。较低因子减少内存浪费但增加重分配次数。