vector
- 00.vector简述
- vector和C++内建的array是类似的,不同的时array时静态的,vector则是动态的,可以根据实际进行自动的配置,而array则是不可在改变的。
- vector的技术实现主要是其当空间不足时的情况,即扩容和拷贝数据的策略。
- vector的结构
template<class T , class Alloc = alloc >
class vector
{
...
protected:
iterator start ; //表示目前使用空间的头
iterator end ; //表示目前使用空间的尾
iterator end_of_storage //表示目前空间的尾
};
- vector内存扩展规则
- 当一个vector创建时是不会分配空间的。
- vector第一插入数据,检查当前end和end_of_storage是一样的,此时空间不足以插入一个元素,于是进行扩容。
- 扩容规则,当第一次扩容2个,后面每次都是原来容量大小的2倍。 当然这个扩容倍数每个平台都是根据自己最优情况定的。
- vector常用操作
push_back()
- 当容量足够时,这个操作是在尾部插入一个元素,其实就是end往后移动了一下。
- 容量不足时,向申请原来大小两倍的容量进行扩容,将原数据进行拷贝到新空间,将新元素插入新空间,释放原来vector空间,重新定义start,end,end_of_storage三个指向。
- 注意增容的动作,这个动作导致了空间的重新分配,指向原来的vector的所有迭代器全部失效了,不能继续访问,否则就是访问了一块不属于自己空间。
erase()
方式1,erase( iterator pos )删除某个位置的节点,其实就是把pos位置后面的都向前移动一个,然后delete掉pos位置元素,–finish.
a. 就是把pos后每一个位置向前移动,进行覆盖
b. 析构掉finish的位置(重复出现了)
c. --finish方式2,erase( first , last )删除一段区间的元素(左闭右开),请看下图
a. 先将last到finish的数据拷贝到以first的位置(将删除元素后面的拷贝到删除位置)
b. 析构掉后面重复元素。
c. 将finish位置根据删除元素向前调整
clear( )
1.其实clear就是直接调用了earse(vector: :start , vector: :end)
2.clear只是清理了元素,析构对象,改变vector: :end位置,但是不改变vector: :end_of_storage的位置,即vector的容量不变。
insert
- insert ( iterator pos ,size_t type, const T&x) ,即从pos开始向其中插入n个x。
2.当被用空间大于新增元素个数:
3.当备用空间小于新增元素个数:
a. 这里当备用空间小于新增元素的个数时,涉及到上述说过的问题,即空间位置可能变化了,所以此时原来的vector的迭代器可能失效,所以要注意使用。