1. 为什么需要理解vector源码与迭代器失效
作为C++开发者,我们每天都在和STL容器打交道。vector作为最常用的序列式容器,其内部实现机制直接影响着我们的代码质量和运行效率。但很多人只是停留在"会用"的层面,当遇到迭代器失效这类问题时往往束手无策。
记得我刚工作时,曾遇到过这样的bug:在遍历vector时删除元素导致程序崩溃。当时花了整整两天才定位到是迭代器失效的问题。如果当时能深入理解vector的底层实现,这个bug可能十分钟就能解决。这就是为什么我们需要深入vector源码——不是为了炫技,而是为了写出更健壮的代码。
2. vector的核心实现机制
2.1 内存管理策略
vector最核心的特性就是动态扩容。与数组不同,vector不需要我们手动管理内存,它会自动增长。但自动增长的代价是什么?让我们看看gcc的实现:
cpp复制template<typename _Tp, typename _Alloc>
void vector<_Tp, _Alloc>::_M_realloc_insert(iterator __position, const _Tp& __x)
{
const size_type __len = _M_check_len(size_type(1), "vector::_M_realloc_insert");
pointer __new_start = this->_M_allocate(__len);
pointer __new_finish = __new_start;
// ...元素搬移逻辑...
_M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage - this->_M_impl._M_start);
this->_M_impl._M_start = __new_start;
this->_M_impl._M_finish = __new_finish;
this->_M_impl._M_end_of_storage = __new_start + __len;
}
关键点在于:
- 扩容时通常会申请当前容量2倍的新空间(
