_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模块讲解,基本上是纯理论偏多. 对于日常开发者来讲很少会使用到本章节的内容,但是对框架作者等是必备知识,同时也是高频的面试常见问题. 官方文档 线程安全 线程安 ...
随机推荐
- data和string类型之间的相互转换
package main; import java.text.SimpleDateFormat;import java.util.Date; import freemarker.core.ParseE ...
- Echarts修改legend样式
legend: { icon: 'rect', itemWidth: 20, itemHeight: 10, itemGap: 10}
- Linux shell命令之cat
cat:查看文件的内容.连接文件.创建一个或多个文件和重定向输出到终端或文件 用法:cat [选项] [文件] 1. $ cat hello.txt 显示hello.txt文本文件中的内容 2. $ ...
- anime.js 实战:实现一个带有描边动画效果的复选框
在网页或者是APP的开发中,动画运用得当可以起到锦上添花的作用.正确使用动画,不但可以有助于用户理解交互的作用,还可以大大提高网页应用的魅力和使用体验.并且在现在的网页开发中,动画已经成为了一个设计的 ...
- Unity笔记(2)自学第一天
学习记录: 界面使用:
- Android APK瘦身之webp图片
webp格式是谷歌推出的一种有损压缩格式,这种图片格式相比png或者jpg格式的图片损失的质量几乎可以忽略不计,但是压缩后图片的体积却比png或者jpg要小很多.亲测一个100kb的png图片经过we ...
- Android显示相册图片和相机拍照
首先看最重要的MainActive类: public class MainActivity extends AppCompatActivity { private final int FROM_ALB ...
- cookie、json详解
什么是cookie 1.cookie是存储于访问者计算机中的变量2.cookie是浏览器提供的一种机制3.可以由js控制(设置.读取.删除)4.cookie可以实现跨页面全局变量可以跨越同域名下多个网 ...
- SpringBoot项目的mybatis逆向工程
<dependencies> <!--mybatis--> <dependency> <groupId>org.mybatis.spring.boot& ...
- mysql数据转sql server
创建一个mysql的ODBC数据源,在sql server中“任务”-“导入数据” -“选择创建的ODBC数据源” 然后填写服务器 登录名.密码,需要导入的数据库表什么的