_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模块讲解,基本上是纯理论偏多. 对于日常开发者来讲很少会使用到本章节的内容,但是对框架作者等是必备知识,同时也是高频的面试常见问题. 官方文档 线程安全 线程安 ...
随机推荐
- E1963A/E6703B W-CDMA Online User's Guide
官网资料地址: http://rfmw.em.keysight.com/rfcomms/refdocs/wcdma/
- Markdown基本语法学习
Markdown是一种纯文本格式的标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式. 创始人 John Gruber 的 Markdown 语法说明 Markdown 中文版语法说明 ...
- scala-基础-映射(1)
//映射(1)-构建,获取,更新,迭代,反转,映射(可变与不可变 互换) class Demo1 extends TestCase { //构建与获取 def test_create_^^(){ // ...
- JS高级——监听浏览器的返回事件
https://www.cnblogs.com/Easty/p/7820055.html https://www.cnblogs.com/zhengyan/p/6912526.html http:// ...
- putty源码阅读----plink
一直对ssh协议的各种客户端实现比较入迷,遍寻了很多ssh协议实现也用了很多的库,发现依赖太多 putty是最纯洁依赖第三方几乎为0的客户端实现,先从plink处开始入手. 1.putty目录 才刚开 ...
- swift- mutating
struct Stack<Element> { var items = [Element]() func push(_ item:Element){ self.items.append(i ...
- Linux下查看CPU信息、机器型号等硬件信息命令
Linux下查看CPU信息.机器型号等硬件信息命令 编写一个bash脚本: vim info.sh #!/bin/bash cat /etc/issue echo "____________ ...
- tab下拉显示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- 类模板成员函数默认值问题:an out-of-line definition of a member of a class template cannot have default arguments
template <typename T> class A { ); }; template<typename T> ) { /* */ } 对于类似上文代码,VS编译器会报 ...
- Nginx+Tomcat简单负载均衡
Nginx,Apache安装完成 复制Tomcat: tomcat-8080 tomcat-8081 启动Tomcat8080: cd /usr/local/tomcat-8080/bin ...