STL源码剖析:【4】Sequence Containers-vector

Vector 特性概述:

  1.  类比Array(C++内置) (我们常用的数组);内存连续;
  2.  为容器型加入了迭代器; 因为内存空间连续,因此迭代器类型为原生指针 T*
  3.  最大不同是隐藏容量扩充机制,将扩充机制封装在Vector中,程序使用者不必为了扩容而增加额外逻辑
  4. 其次因为内部进行申请空间,所以无法进行Random赋值,你得先push_back/pop_back才可以进行Random级读取[],然后进行操作,所以它也是一个单向开口连续线性空间

重点:自动扩充原理,插入,删除 原理

Vector数据结构:

  • Class Data Member : iterator start,finsh,end_of_storage; // Vector是内置的迭代器来标识数组的范围
  • Class Function Member :                 begin(),end(),size(),capacity(),front(),back(),push_back(),pop_back(),erase(),resize(),clear(),insert_aux() 

Vector Member Function 简要分析:

  • void push_back(const T& x) : 这个是插入操作里面最简单的;因为不存在后置位元素的顺位操作。基本过程:如果end_of_stroage != finish 即存在剩余容量,在finsh处初始化成员即可 否则调用insert_aux 进行扩容
  • void vector<T,Alloc>::insert_aux(iterator position,const T&x): data_allocator::allocate(len);然后调用uninitialized_copy(start,position,new_start)初始化,将原空间destroy/deallocate掉,设置新的start、finish、end_of_storage空间
  • void pop_back(): --finish;内调用destroy(finish)
  • iterator erase(iterator first,iterator last) : {iterator i = copy (last,finish,first); destroy(i,finish);},注意这个地方以及pop_back,先进行覆盖移位,然后进行destroy操作,特别的,没有释放掉内存,而是继续交由vector的end_of_storage进行管理等待分配
  • void vector<T,Alloc>::insert(iterator position,size_type n,const T& x): 如果剩余空间满足,就采用如下拷贝策略,以position为切割点,确定position后到oldFinish处的数量 after_insert_n,使用这个与插入的n作比较,如果前者大于后者,将oldFinsh后申请并补足差值,将原finsh前的n个元素,使用copy_backward 赋值到原finish后的n个位置,在原先的n个.....产生这个区别的根本原因是:从vecctor中申请uninitialized内存,以及在已经Initialized的内存中重新赋值的操作是不一样的,所以区别开,在移位的时候做特殊处理

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值