vector容器是一种类似于数组的容器,主要差别是vector可以实现自增长;
在对于vector容器调用resize函数时,形式为resize(N,val),STL会先判断当前的元素size个数是否大于要调整的大小N,如果大于,则直接将大于N的那部分元素擦除(调用erase函数),capacity不变;
如果小于,则会在当前的最后一个元素后边添加”N-size“个val值,这时capacity会视剩余容量大小来改变;
插入元素的空间配置:
注意vector的初始容量大小是0,当进行插入元素时,如果是第一次插入,会发现当前容量大小为0,则会先开辟一个元素的空间,然后再插入的时候如果发现空间不够,则开辟原来空间的两倍大小;
同时,因为STL的空间配置不是完全都会成功的,所以STL在每次分配空间时,会catch错误,保证错误在本函数内消化,不向上传播。
总的来说,vector的插入元素会出现三种情况:
1):如果当前剩余的容量足够插入元素,则判断插入元素的位置后边的元素数量elemNum与将要插入的元素数量N进行对比,如果elemNum < N,
则第一步:会先在容器的末尾处插入N-elemNum个元素,第二步:然后改变finish指针,第三步:将elemNum个原来的元素copy到finish指针后边,
第四步:重新更新finish指针,第五步:将elemNum个val插入值放进容器的空洞中;
2):如果当前剩余的容量足够插入元素,则判断插入元素的位置后边的元素数量elemNum与将要插入的元素数量N进行对比,如果elemNum > N,
则第一步会将后边的elemNum元素向后移动N个空格,第二步:更新finish指针,第三步:用插入值val填充容器的空洞(这个具体操作是分四步,但是总体是这么个移动法);
3):如果当前剩余的容量不够插入元素,则重新配置空间,分为四步:第一步:先将插入位置前边的所有元素复制到新的空间,第二步:填充N个val到新的空间;第三步:拷贝position后边的元素到新的空间;
第四步:销毁原来的空间;
erase元素的操作:
擦除元素是使用了类似于狸猫换太子的方法,将擦除位置以后的所有元素向左移动一格,这样目标擦除位置的元素也就不见了;所以erase函数返回position也就指向了被擦除元素的下一个位置;