STL-vector容器(简述)

vector


  • 00.vector简述
  1. vector和C++内建的array是类似的,不同的时array时静态的,vector则是动态的,可以根据实际进行自动的配置,而array则是不可在改变的。
  2. vector的技术实现主要是其当空间不足时的情况,即扩容和拷贝数据的策略。
  3. vector的结构
template<class T , class Alloc = alloc >
class vector
{
...
protected:
    iterator start ;                 //表示目前使用空间的头
    iterator end  ;                  //表示目前使用空间的尾
    iterator end_of_storage           //表示目前空间的尾
}; 
  • vector内存扩展规则
  1. 当一个vector创建时是不会分配空间的。
  2. vector第一插入数据,检查当前end和end_of_storage是一样的,此时空间不足以插入一个元素,于是进行扩容。
  3. 扩容规则,当第一次扩容2个,后面每次都是原来容量大小的2倍。
  • vector常用操作


push_back()

1. 当容量足够时,这个操作是在尾部插入一个元素,其实就是end往后移动了一下。
2. 容量不足时,向申请原来大小两倍的容量进行扩容,将原数据进行拷贝到新空间,将新元素插入新空间,释放原来vector空间,重新定义start,end,end_of_storage三个指向。
3. 注意增容的动作,这个动作导致了空间的重新分配,指向原来的vector的所有迭代器全部失效了,不能继续访问,否则就是访问了一块不属于自己空间。



erase()

  1. 方式1,erase( iterator pos )删除某个位置的节点,其实就是把pos位置后面的都向前移动一个,然后delete掉pos位置元素,–finish.
    这里写图片描述
    这里写图片描述
    a. 就是把pos后每一个位置向前移动,进行覆盖
    b. 析构掉finish的位置(重复出现了)
    c. –finish

  2. 方式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

1. insert ( iterator pos ,size_t type, const T&x) ,即从pos开始向其中插入n个x。
2.当被用空间大于新增元素个数:
这里写图片描述
这里写图片描述
这里写图片描述
3.当备用空间小于新增元素个数:
这里写图片描述
a. 这里当备用空间小于新增元素的个数时,涉及到上述说过的问题,即空间位置可能变化了,所以此时原来的vector的迭代器可能失效,所以要注意使用。

猜你喜欢

转载自blog.csdn.net/SkinWhite/article/details/81383252