先了解几个必要成员及函数:
1 | //对源码略作调整 |
这里先学习 insert() 函数(后面介绍另一个版本的 insert():插入n个指定元素):关于 construc() 函数的介绍可以参见其它博客
1 | iterator insert(iterator __position, const _Tp& __x) |
跟踪进入 Minsert_aux() 函数
1 | template <class _Tp, class _Alloc> |
STL 提供了两个版本的 push_back() 函数,
1 | void push_back(const _Tp& __x) { |
push_back() 与 insert() 都有调用Minsert_aux() 的情况,二者不同的是,push_back() 只从尾端插入元素,相当于push_back() 是 insert() 函数的一个特例。或许 push_back() 应该定义为:
1 | void push_back(const _Tp& __x) |
从上面可知,vector 增加(插入)新元素时,如果未超过当时的容量,则还有剩余空间,那么直接添加到最后(插入指定位置),然后调整迭代器,这里的 construct() 前面有介绍,是在已分配好的内存上构造对象,这里已分配好的内存定位到剩余空间的起始位置。如果没有剩余空间了,则会重新配置原有元素个数的两倍空间,然后将原空间元素通过复制的方式初始化新空间,再向新空间增加元素,最后析构并释放原空间。
下面学习 pop_back() ,erase(),clear() 等函数的内部实现:
1 | void pop_back() { |
下面给出局部区间的 erase() 操作图(《STL 源码剖析》)
这里继续学习 insert() 的另一个版本,往指定位置插入 n 个指定元素:insert(position, n, x)
1 | void insert(iterator __pos, size_type __n, const _Tp& __x) |
下面给出 insert() 各种情况下的操作图
最后再学习 resize(),reserve() 和 swap()函数的内部实现
1 | //将vector大小重置为 __new_size |
好了,容器 vector 的内部机制主要就是这些了,未巨细的参见源码。