vector源码1(参考STL源码--侯捷)

vector源码2(参考STL源码--侯捷):空间分配、push_back

vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效

vector源码3(参考STL源码--侯捷):pop_back、erase、clear、insert

pop_back

//删除尾部元素,调整大小
void pop_back(){
--finish; //尾端标记往前一格,表示放弃尾部元素
destroy(finish);
}

erase

//清除(first,last)中的所有元素
iterator erase(iterator first,iterator last){
iterator i=copy(last,finish,first);//将last到finish的元素往前复制,从first位置开始
destory(i,finish);
finish=finish-(last-first);
return first;
}
//清除某个位置上的元素
iterator erase(iterator position){
if(position+!=end()){
copy(position+,finish,position);
}
--finish;
destory(finish);
return position;
}

clear

void clear(){
erase(begin(),end());
}

insert

template <class T,class Alloc>
void vector<T,Alloc>::insert(iterator position,size_type n,const T& x){
if(n!=){
if(size_type(end_of_storage-finish)>=n){
//备用空间大于等于"新增元素"
T x_copy=x;
//以下计算插入点之后的现有元素个数
const size_type elems_after=finish-position;
iterator old_finish=finish;
if(elems_after>n){
//(1)、"插入点之后的现有元素个数"大于"新增元素个数"(见图1)
//①从finish处开始复制范围(finish-n,finish)的元素
uninitialized_copy(finish-n,finish,finish);
finish+=n; //②vector尾部后移
//③将范围(position,old_finish-n)的元素移到(,old_finish)处

copy_backward(position,old_finish-n,old_finish);
//④从插入点开始填入元素
fill(position,position+n,x_copy);
}
else{
//(2)、"插入点之后的现有元素个数"小于"新增元素个数"(见图2)
//①从finish处复制n-elems_after个元素x_copy
uninitialized_fill_n(finish,n-elems_after,x_copy);
finish+=n-elems_after; //②vector尾部后移
//③从finish处开始复制范围(position,old_finish)的元素

uninitialized_copy(position,old_finish,finish);
finish+=elems_after; //④vector尾部后移
//⑤从插入点开始填入元素

fill(position,old_finish,x_copy);
}
}
else{
//备用空间大于等于"新增元素",即必须配置额外空间
//首先决定新长度,旧长度的两倍,或者旧长度+新长度(见图3)
const size_type old_size=size();
const size_type len=old_size+max(old_size,n);
//以下配置新的vector空间
iterator new_start=data_allocator::allocate(len);
iterator new_finish=new_start;
__STL_TRY{
//①先将旧的vector的插入点之前的元素复制到新的空间
new_finish=uninitialized_copy(start,position,new_start);
//②再将新增的元素填入新空间
new_finish=uninitialized_fill_n(new_finish,n,x);
//③再将旧vector的插入点之后的元素复制到新空间
new_finish=uninitialized_copy(position,finish,new_finish);
}
#ifdef __STL_USE_EXCEPTIONS
catch(...){
//如果发现异常,实现rollback
destory(new_start,new_finish);
data_allocator::deallocate(new_satrt,len);
throw;
}
#endif /*__STL_USE_EXCEPTIONS*/
//以下清除并释放旧的vector
destory(start,finish);
deallocate();
//调整水位标记
start=new_start;
finish=new_finish;
end_of_storage=new_start+len;
}
}
}
}

图1

图2

图3

vector源码3(参考STL源码--侯捷):pop_back、erase、clear、insert的更多相关文章

  1. vector源码2(参考STL源码--侯捷):空间分配、push_back

    vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源 ...

  2. vector源码1(参考STL源码--侯捷):源码

    vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源 ...

  3. list源码1(参考STL源码--侯捷):list节点、迭代器、数据结构

    list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...

  4. list源码2(参考STL源码--侯捷):constructor、push_back、insert

    list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...

  5. list源码4(参考STL源码--侯捷):transfer、splice、merge、reverse、sort

    list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...

  6. list源码3(参考STL源码--侯捷):push_front、push_back、erase、pop_front、pop_back、clear、remove、unique

    list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...

  7. vector源码(参考STL源码--侯捷):空间分配导致迭代器失效

    vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源 ...

  8. STL 源码分析 (SGI版本, 侯捷著)

    前言 源码之前,了无秘密 algorithm的重要性 效率的重要性 采用Cygnus C++ 2.91 for windows cygwin-b20.1-full2.exe 下载地址:http://d ...

  9. STL源码剖析之序列式容器

    最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...

随机推荐

  1. 搭建中小规模集群之rsync数据同步备份

    NFS重要问题 1.有关NFS客户端普通用户写NFS的问题. 1)为什么要普通用户写NFS. 2)exports加all_squash. Rsync介绍 什么是Rsync? Rsync是一款开源的.快 ...

  2. mybatis动态排序

    如果我们要传入排序字段作为一个参数到mybatis中,用以实现按照指定字段来排序的功能,那么我们需要使用$,而不是像其他参数一样,使用#.如下所示. <if test="sortnam ...

  3. [leetcode]256. Paint House粉刷房子(三色可选)

    There are a row of n houses, each house can be painted with one of the three colors: red, blue or gr ...

  4. python基础(二)列表与字典

    列表list-数组stus=['苹果','香蕉','橘子','红枣',111.122,]# 下标 0 1 2 3 4#下标,索引,角标#print(stus[4]) #st=[]#空list#st=l ...

  5. adb、monkey常用命令

    adb.monkey常用命令 1.查看连接设备 adb devices 2.连接android模拟器 adb connect 127.0.0.1:62001 3.安装软件 adb install 这个 ...

  6. How Xtuner E3 works for BMW 520d Diagnosis and initialization of CBS service

    Using Xtuner E3 to perform BMW 520d Diagnosis and initialization of CBS service in step by step proc ...

  7. b2b b2c o2o电子商务微服务云平台

    大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B2C.C2C.O2O.新零售.直播电商等子平台. 根据微服务化设计思想,结合spring cloud一 ...

  8. python基本数据类型之集合

    python基本数据类型之集合 集合是一种容器,用来存放不同元素. 集合有3大特点: 集合的元素必须是不可变类型(字符串.数字.元组): 集合中的元素不能重复: 集合是无序的. 在集合中直接存入lis ...

  9. shell脚本学习-执行

    跟着RUNOOB网站的教程学习的笔记 Shell与Shell脚本 Shell是用户与Linux系统的桥梁.它既是一种命令语言,也是一种程序设计语言. Shell脚本是一种Shell编写的脚本程序,其实 ...

  10. java时间与js时间

    这是一个由java获取的系统时间与js获取的系统时间不一致导致的测试缺陷 定义方式: java Date date = new Date(); js var Date date2 = new Date ...