_deque实现
/*
deque是一种双向开口的连续线性空间,可以在头尾两端分别做元素的插入和删除操作
常用接口:back(), front(), push_back(), pop_back(), push_front(), pop_front()
deque与vector差异:
1.deque允许于常数时间内对头部进行元素的插入和移除操作
2.deque没有容量(capacity)概念,由分段连续空间组合而成,随时可以增加一段新的空间并链接起来,
而vector当空间不足时,需要重新配置一块更大空间,然后复制元素,再释放旧空间 注意:deque的迭代器不是普通指针,操作复杂度比vector迭代器要大,所以应尽可能选择使用vector
对deque进行的排序操作,为了最高效率,可将deque复制到vector,将vector排序后,再复制回deque
*/ /*
deque采用一小块连续空间,其中每个元素都是指针,指向另一段较大的连续线性空间,称为缓冲区,缓冲区是
deque的储存空间主体,SGI STL允许我们指定缓冲区大小,默认值0表示将使用512bytes缓冲区
*/ template <class T,class Alloc=alloc,size_t BufSiz=>
class deque
{
public:
typedef T value_type;
typedef value_type* pointer;
typedef _deque_iterator<T, T&, T*, BufSiz> iterator;
//... protected:
typedef pointer* map_pointer;
typedef size_t size_type;
map_pointer map;//指向map,map是块连续空间,其内的每个元素都是一个指针,指向一块缓冲区
size_type map_size;//map内可容纳指针数
iterator start;//指向第一个缓冲区的第一个元素
iterator finish;//指向最后缓冲区的最后一个元素的下一位置 }; //迭代器实现
template<class T,class Ref,class Ptr,size_t BufSiz>
struct _deque_iterator
{
typedef _deque_iterator<T, T&, T*, BufSiz> iterator;
typedef _deque_iterator<T, const T&, const T*, BufSiz>const_iterator; //未继承iterator
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;// 该迭代器所指的缓冲区中的当前元素
T* first;// 该迭代器所指的缓冲区的头
T* last;// 该迭代器所指的缓冲区的尾
map_pointer node;// 指向map空间中指向对应缓冲区的结点 //返回缓冲区中元素个数
static size_t buffer_size(); //当迭代器行进时遇到缓冲区边缘,需要调用set_node()跳一个缓冲区
void set_node(map_pointer new_node)
{
//new_node指向新缓冲区
node = new_node;
first = *new_node;
last = first + difference_type(buffer_size()); } reference operator*()const
{
return *cur;
} pointer operator->()const
{
return &(operator*());
} difference_type operator-(const self &x)const
{
return difference_type(buffer_size())*(node - x.node - ) + (cur - first) + (x.last - x.cur);
}
//前置
self& operator++()
{
++cur;
if (cur == last)
{
set_node(node + );
cur = first;
}
return *this;
}
//后置
self operator++(int)
{
self tmp = *this;
++*this;//调用上面的++
return tmp;
}
self& operator--()
{
if (cur == first)
{
set_node(node - );
cur = last;
}
--cur;
return *this;
}
self operator--(int)
{
self tmp = *this;
--*this;
return tmp;
}
};
_deque实现的更多相关文章
- day9--多线程与多进程
线程: 什么是线程? 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线 ...
- 双端循环列表实现栈(python)
# -*- coding: utf-8 -*- from collections import deque class Node(object): def __init__(self, value=N ...
- 数据结构(python)
列表 list 在头部进行插入是个相当耗时的操作(需要把后边的元素一个一个挪个位置).假如你需要频繁在数组两头增删,list 就不太合适.数组是最常用到的一种线性结构,其实 python 内置了一个 ...
- 线程协作之threading.Condition
领会下面这个示例吧,其实跟java中wait/nofity是一样一样的道理 import threading # 条件变量,用于复杂的线程间同步锁 """ 需求: 男:小 ...
- Python3中最常用的5种线程锁你会用吗
前言 本章节将继续围绕threading模块讲解,基本上是纯理论偏多. 对于日常开发者来讲很少会使用到本章节的内容,但是对框架作者等是必备知识,同时也是高频的面试常见问题. 官方文档 线程安全 线程安 ...
随机推荐
- RabbitMQ~广播消息
定义 广播消息是指生产者产生的消息将分发给所有订阅这个消息的消费者,而普通的模式是:一批消息可以被多个人共同消费,如consumer1可能消费1,3,5记录,而consumer2可能消费的是2,4,6 ...
- SQL函数类的操作,增加,查询
数据库连接: 表的创建: 创建连接对象,命令对象类: 添加函数: 查询函数类: List<>集合,里面专门放对象 函数主体: 查询: foreach只能修改,不能添加删除
- Modbus通讯错误检测方法
标准的Modbus串行网络采用两种错误检测方法.奇偶校验对每个字符都可用,帧检测(LRC和CRC)应用于整个消息.它们都是在消息发送前由主设备产生的,从设备在接收过程中检测每个字符和整个消息帧. 用户 ...
- cocos2d-x android 环境部署
1.下载jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.下载 and ...
- PHP开发心得一
1,php获得服务器时间 $time= date('Y-m-d H:i'); echo $time; 一般写法如上,但发现打印出来的时间小时数总数不对,和机器的时间差几个小时.查资料发现,要设定时区. ...
- Farseer.net轻量级开源框架 中级篇:动态数据库访问
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 自定义配置文件 下一篇:Farseer.net轻量级开源框架 中级篇: 数据库切换 ...
- CAD从二进流加载数据(com接口VB语言)
主要用到函数说明: MxDrawXCustomFunction::ReadBinStreamEx 从二进流加载数据,详细说明如下: 参数 说明 IMxDrawBinStream* pBinStream ...
- JavaScipt30(第四个案例)(主要知识点:数组原型链上的一些方法)
承接上文,下面是第四个案例 附上项目链接: https://github.com/wesbos/JavaScript30 const inventors = [ { first: 'Albert', ...
- vue基础---事件处理
(1)事件监听 v-on 指令监听 DOM 事件,并在触发时运行JS代码 <div class="event_area"> {{message}} <button ...
- 小程序wx:key = “{{*this}}”报错
解决方案:改为 wx:key = "*this"