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. java正则积累

    1. [.]点:再分割的时候不可以直接使用点,需要加上 \\ 转义才可以得到想要的结果,否则输出的时候会报异常 数据下标越界 String[] split = "output.txt&quo ...

  2. 735. Asteroid Collision彗星相撞后的消失数组

    [抄题]: We are given an array asteroids of integers representing asteroids in a row. For each asteroid ...

  3. IMU

    (1)用IMU来进行预测 读入一个10/20帧的数据集,通过IMU来初步预测出位姿以及显示其路径. Christian Forster, Luca Carlone, Frank Dellaert, D ...

  4. 微擎开发------day01

    微擎的数据常量 $_GPC   -- 全局请求变量 类型: array 说明: 合并请求参数, 包括 $_GET, $_POST, $_COOKIE的内容. 相同键名覆盖规则为 $_COOKIE 覆盖 ...

  5. 四、Vmware虚拟机三种网络模式详解

    转载自: http://note.youdao.com/share/web/file.html?id=236896997b6ffbaa8e0d92eacd13abbf&type=note 1. ...

  6. 201771010134杨其菊《面向对象程序设计java》第七周学习总结

    第七周学习总结 第一部分:理论知识 1.继承是面向对象程序设计(Object Oriented Programming-OOP)中软件重用的关键技术.继承机制使用已经定义的类作为基础建立新的类定义,新 ...

  7. day0-功能自动化的前提

    自动化不是万能的,不是什么产品都适合自动化测试,那些产品适合自动化测试? 只要满足下面三个条件就可以进行自动化测试 一:软件需求变动不频繁 二:项目周期较长 自动化测试框架的设计.脚本的开发与调试需要 ...

  8. Oracle中为表设置自动增长的标识列

    -- Create sequence create sequence INNERID minvalue 1 maxvalue 99999999999999 start with 1 increment ...

  9. AX_SysExcel

    void KTL_CPeng_ImportCustStamp()  {      str                 file;      FileNameFilter      filter = ...

  10. python 实践项目

    项目一:让用户输入圆的半径,告诉用户圆的面积 思路: 1.首先需要让用户输入一个字符串,即圆的半径 2.判断用户输入的字符串是否为数字  isalpha 3.求圆的面积需要调用到math模块,所以要导 ...