vector是STL中最常用的序列式容器,vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容乃新元素
vector的实现技术,关键在于对大小的控制以及重新配置时的数据移动效率
vector概览
1 | template <class _Tp, class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) > |
可以看到,vector依赖于_Vector_base,其使用的空间配置器_Alloc
依赖于stl_config.h
中的配置
1 |
vector的迭代器
vector提供的是Random Access Iterator,普通指针就具备这种条件
vector的数据结构
vector使用两个iterator指向头部和尾部,指向尾部的包含指向可用空间的尾部和当前空间的尾部
1 | _Tp* _M_start; |
下面给出的begin
和end
获取的迭代器就是以上定义的指针
1 | iterator begin() { return _M_start; } |
对于_M_end_of_storage
,则是判断是否需要重新分配内存的依据
1 | void push_back(const _Tp& __x) { |
vector的空间管理
如果无可用空间,就会交给_M_insert_aux
处理
1 | template <class _Tp, class _Alloc> |
从上面可以看出,所谓的动态分配不过是再次申请,因此对于vector的操作,一旦引起重新分配,iterator
就会失效
vector的元素操作
1 | void pop_back() { |
以上的都是比较简单的元素操作,大抵是进行拷贝,析构,调整边界之类的
不过insert
就会比较复杂
1 | void insert (iterator __pos, size_type __n, const _Tp& __x) |