stl源码剖析 详细学习笔记deque(1)
//--------------------------15/3/12----------------------------
deque
{
deque没有容量(capacity)观念,是动态分段的,没有reserve(保留)功能;
缓存区大小默认为,表示有bytes;
以map作为主控;
//map
{
map是连续的空间,每个元素称为节点(node),都是一个指针,指向另一段连续的线性空间,称为缓存区;
缓存区是deque的储存主体;
}
//class
{
>
class deque
{
typedef T value_type;
typedef value_type* pointer;
map_pointer map; //指向map,map时块连续空间
map(T**)
size_type map_size; //map内克容纳多少指针
};
}
//iteratoer
{
为了使deque看起来是连续的要重载++
--的运算符;
// struct __deque_iterator
{
template<class T,class Ref,class
Ptr,size_t BufSiz>
struct __deque_iterator
{ //未继承std::iterator(为什么)
typedef __deque_iterator<T,T&,T*,BufSiz> iterator;
typedef __deque_iterator<T,const T&,const T*,BufSiz> const_iterator;
static size_t buffer_size(){return __deque_buf_size(BufSiz,sizeof(T));}
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef Ptr pointer;
typedef Ref reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef T** map_pointer;
typedef __deque_iterator self;//(为什么,仅仅是为了方便?)
T* cur; //缓存区中的现行(current)元素
T* first; //缓存区的头
T* last; //尾
map_pointer node;//当前节点 T**
}
/*
原书的说法是错的!!!!!!
n==0 表示缓存区为系统默认大小,返回(512/sz)个(sz大小的)缓存区
(T<512 bytes, 512bytes==sz*(512/sz)),
或者1个(sizeof(T)大小的缓存区)(T>=512 bytes
n!=0 表示用户要自定义缓存区大小,直接返回n个(sizeof(T)大小)缓存区;
*/
inline size_t __deque_buf_size(size_t n,size_t sz)
{
? n : (sz < ? size_t(/sz)
: size_t());
}
//set_node用于跳过一个缓存区
void set_node(map_pointer new_node)
{
node=new_node; //把当前节点设置成new_node
first=*new_node; //把缓存区的头设置成*new_node
last=first+difference_type (buffer_size());//尾部
}
referenceoperator*()const {return *cur;)}
//取出的数据就是T( cur:{T*} -->> *cur:{T})
pointeroperator->()const{return &(operator*());}
//operator*():{T}-->>&(operator*()):{T*}
difference_typeoperator-(const self& x)const
{
/*
例子:
假设‘/’表示一个node 假设一个缓存区有8个‘#’也就是说buffer_size()为8
node -> ///// -> ####
(当前节点为第5个缓存区) (cur指向第4个元素)
x -> /// -> ###
(当前节点为第3个缓存区) (cur指向第3个元素)
4号缓存区: 5-3-1=1得到一个完整的缓存区 -->> 8*1个(T类型)(x1*x2)
5号缓存区: 4-1=3 得到3个(T类型) (x3)
3号缓存区: 9-3=6 得到6个(T类型)
(x4)
8+3+6=17;
分析:
x1=difference_type(buffer_size())
为一个缓存区的个数(T类型)
x2=(node - x.node - 1)
为本对象的node节点-目标对象的node节点的个数(缓存区)减1
x3=(cur - first) 为当前元素-这个缓存区第一个元素所得个数(T类型)
x4=(x.last - x.cur)
为目标对象node节点的最后元素-其当前元素所得的元素个数(T类型)
return value(假设有个返回值)==x1*x2+x3+x4;
*/
) +
(cur - first) + (x.last - x.cur);
}
stl源码剖析 详细学习笔记deque(1)的更多相关文章
- stl源码剖析 详细学习笔记deque(3)
protected: typedef simple_alloc<value_type,Alloc> data_allocator; //用来配置元素的alloc typedef simpl ...
- stl源码剖析 详细学习笔记deque(2)
//---------------------------15/3/13---------------------------- self&operator++() { ++cur; if(c ...
- stl源码剖析 详细学习笔记 hashtable
//---------------------------15/03/24---------------------------- //hashtable { /* 概述: sgi采用的是开链法完成h ...
- stl源码剖析 详细学习笔记 set map
// // set map.cpp // 笔记 // // Created by fam on 15/3/23. // // //---------------------------15/03 ...
- stl源码剖析 详细学习笔记 RB_tree (1)
// // RB_tree_STL.cpp // 笔记 // // Created by fam on 15/3/21. // // #include "RB_tree_STL.h&q ...
- stl源码剖析 详细学习笔记priority_queue slist
// // priority_queue.cpp // 笔记 // // Created by fam on 15/3/16. // // //------------------------- ...
- stl源码剖析 详细学习笔记heap
// // heap.cpp // 笔记 // // Created by fam on 15/3/15. // // //---------------------------15/03/15 ...
- stl源码剖析 详细学习笔记stack queue
// // stack.cpp // 笔记 // // Created by fam on 15/3/15. // // //---------------------------15/03/1 ...
- stl源码剖析 详细学习笔记 空间配置器
//---------------------------15/04/05---------------------------- /* 空间配置器概述: 1:new操作包含两个阶段操作 1>调 ...
随机推荐
- mongodb的搭建
1, vi /etc/yum.repos.d/mongodb-org-3.2.repo 2, 添加如下内容 [mongodb-org-3.2] name=MongoDB Repo ...
- jboss-as- 7.1.1.Final配置jndi数据源
初次使用jboss7.1.1.final部署项目,遇到了很多困难,最终通过查看官方文档和网上资料得以解决,特此记录一下. error information 2016-05-12 12:53:20 J ...
- svn Please execute the 'Cleanup' command. 问题解决
1由于使用svn 更新文件出错,导致svn中断,然后就一直循环出现 ‘’Please execute the 'Cleanup' command‘’ 问题: 查找网上方案 . 有使用sqlite3 ...
- MySQL应用架构优化-实时数据处理
1.1. 场景 在和开发人员做优化的时候,讨论最多的应该是结合应用场景编写出合适的SQL.并培训开发应该如何编写SQL让MySQL的性能尽量好.但是有一些的场景对于SQL的优化是行不通的. 打个比方, ...
- 1)HDFS分布式文件系统 2)HDFS核心设计 3 )HDFS体系结构
一.HDFS简介 1.HDFS:Hadoop distributed file system 一个分布式文件系统 基于流数据模式访问和处理超大文件的需要而开发 适合应用在大规模数据集上 2. 优点 处 ...
- Asp.Net WebApi服务的创建
Web API一种REST架构风格的Web服务.所谓的REST架构与技术无关,而是面向资源的一种软件架构设计. WCF自3.5之后也提供了对REST风格的支持,但和WebAPI来比较显得较为笨重,We ...
- postgresql----几何类型和函数
postgresql支持的几何类型如下表: 名字 存储空间 描述 表现形式 point 16字节 平面上的点 (x,y) line 32字节 直线 {A,B,C} lseg 32字节 线段 ((x1, ...
- BZOJ3569:DZY Loves Chinese II(线性基)
Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图, ...
- linux虚拟化课堂总结图2019_4_23
- Docker技术入门与实战 第二版-学习笔记-4-Dockerfile外其他生成镜像的方法
其它生成镜像的方法 即除了标准地使用Dockerfile来生成镜像外,还有一些其他的方法 1)从 rootfs 压缩包导入 格式:docker import [选项] <文件>|<U ...