/*
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;
}
};

最新文章

  1. Servlet规范简介——web框架是如何注入到Servlet中的
  2. File API 读取文件小结
  3. destoon二次开发基础代码
  4. RabbitMQ 工作队列
  5. 使用CSS将图片转换成黑白(灰色、置灰)z转
  6. cocos2d-html5在cocos2d-x里面打包编译
  7. Objc基础学习记录--UIViewController
  8. Objc基础学习记录3
  9. 【个人】IIS Express 配置
  10. sql server 中更改默认实例
  11. wind7下搭建ftp服务器
  12. poj 1015 Jury Compromise_dp
  13. jdk 安装配置
  14. NodeJS网络爬虫
  15. Sql Server的艺术(七) SQL 数据插入操作
  16. Dispatch Group
  17. GBDT总结
  18. 使用iframe方式获得svg中的DOM元素,和svg 的 contentDocument 返回 null
  19. HP服务器设置iLO步凑
  20. DCNN models

热门文章

  1. sublime text 3 使用技巧
  2. java IO流 之 字节输入流 InputString()
  3. Spring:(三) --常见数据源及声明式事务配置
  4. CSS3 opacity
  5. 理解 CSS 布局和块级格式上下文
  6. Indy 编译提示版本不一致问题的解决
  7. 3星|《投机教父尼德霍夫的股票投机术》:2003年的书了。作者97年投机大亏后在CNBC《金钱》栏目上的股市评论文章集。
  8. ThinkPHP---thinkphp模型(M)拓展
  9. Angular ZoneJS 原理
  10. react antD 日期选择