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的迭代器可能失效,所以要注意使用。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值