vector源码3(参考STL源码--侯捷):pop_back、erase、clear、insert
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的更多相关文章
- vector源码2(参考STL源码--侯捷):空间分配、push_back
vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源 ...
- vector源码1(参考STL源码--侯捷):源码
vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源 ...
- list源码1(参考STL源码--侯捷):list节点、迭代器、数据结构
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...
- list源码2(参考STL源码--侯捷):constructor、push_back、insert
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...
- list源码4(参考STL源码--侯捷):transfer、splice、merge、reverse、sort
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...
- 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 ...
- vector源码(参考STL源码--侯捷):空间分配导致迭代器失效
vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源 ...
- STL 源码分析 (SGI版本, 侯捷著)
前言 源码之前,了无秘密 algorithm的重要性 效率的重要性 采用Cygnus C++ 2.91 for windows cygwin-b20.1-full2.exe 下载地址:http://d ...
- STL源码剖析之序列式容器
最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...
随机推荐
- HDU-1160.FatMouse'sSpeed.(LIS变形 + 路径打印)
本题大意:给定一定数量的数对,每个数保存着一只老鼠的质量和速度,让你求出一个最长序列,这个序列按照质量严格递增,速度严格递减排列,让你输出这个序列的最长长度,并且输出组成这个最长长度的序列的对应的老鼠 ...
- ExecuteReader()获得数据
ExecuteReader用于实现只进只读的高效数据查询.ExecuteReader:返回一个SqlDataReader对象,可以通过这个对象来检查查询结果,它提供了只进只读的执行方式,即从结果中读取 ...
- easyui的datagrid改变单元格颜色
另一种方法:https://www.cnblogs.com/raitorei/p/10395233.html easyui的datagrid改变整行颜色:https://www.cnblogs.com ...
- 348. Design Tic-Tac-Toe设计井字游戏
[抄题]: Design a Tic-tac-toe game that is played between two players on a n x n grid. You may assume t ...
- springboot与缓存(redis,或者caffeine,guava)
1.理论介绍 Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry. CachingProvide ...
- Django实现支付宝支付
一 去支付宝申请 - 正式:营业执照 - 测试: 沙箱测试环境 APPID:2016092000554391 买家: esnrce2727@sandbox.com 登录和支付密码: ...
- Android开发之页面跳转传递list集合
这篇随笔这里详细记录两个activity之间如何传递list集合中的数据. 1.首先要对javabean进行序列化处理,即实现Serializable. package com.anhua.bean; ...
- 搭建Fabric网络(二)下载bin和images
上一篇已经把运行和开发Fabric需要的程序都安装好了,这一篇主要讲怎么运行一个简单的Fabric网络. 1. 下载官方Sample代码 git clone -b master https://gi ...
- 杨其菊201771010134《面向对象程序设计Java》第二周学习总结
第三章 Java基本程序设计结构 第一部分:(理论知识部分) 本章主要学习:基本内容:数据类型:变量:运算符:类型转换,字符串,输入输出,控制流程,大数值以及数组. 1.基本概念: 1)标识符:由字母 ...
- 学习blinker
from blinker import signal do_sth = signal('do_sth') #创建信号 def process(f, a, b, **kwargs): f(a, b, * ...