Vector 特性概述:
- 类比Array(C++内置) (我们常用的数组);内存连续;
- 为容器型加入了迭代器; 因为内存空间连续,因此迭代器类型为原生指针 T*
- 最大不同是隐藏容量扩充机制,将扩充机制封装在Vector中,程序使用者不必为了扩容而增加额外逻辑
- 其次因为内部进行申请空间,所以无法进行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的内存中重新赋值的操作是不一样的,所以区别开,在移位的时候做特殊处理