deque 双向队列知识点汇总

1. deque简介

  deque(包含头文件#include<deque>)由若干段连续空间串接而成,一旦有必要在deque的头部或尾端增长新的空间,便配置一段定量连续的空间,串接在deque的头部或尾端。deque的最大任务,就是在这些分段连续的空间上维护其总体连续的假象,并提供随机存取的接口。算法

  实际上。deque内部会维护一个map(注意!不是STL中的map容器)即一小块连续的空间,该空间中每一个元素都是指针,指向另外一段(较大的)区域,这个区域称为缓冲区,缓冲区用来保存deque中的数据。所以deque在随机访问和遍历数据会比vector慢。它首次插入一个元素,默认会动态分配512字节空间,当这512字节空间用完后,它会再动态分配本身另外的512字节空间,而后虚拟地连在一块儿。deque的这种设计使得它具备比vector复杂得多的架构、算法和迭代器设计。它的随机访问和遍历性能比vector差。架构

  deque是一种优化了的对序列两端元素进行添加和删除操做的基本序列容器。一般由一些独立的区块组成,第一区块朝某方向扩展,最后一个区块朝另外一方向扩展。它容许较为快速地随机访问但它不像vector同样把全部对象保存在一个连续的内存块,而是多个连续的内存块。而且在一个映射结构中保存对这些块以及顺序的跟踪。函数

2. 基本函数

2.1 构造函数

  • deque<Elem> c建立一个空的deque;
  • deque<Elem> c1(c2)复制一个deque;
  • deque<Elem> c(n)建立一个deque,含有n个数据,数据均已缺省构造产生;
  • deque<Elem> c(n, elem)建立一个含有n个elem拷贝的deque;
  • deque<Elem> c(begin,end)建立一个以[beg;end)区间的deque;
  • c.~deque<Elem>() 销毁全部数据,释放内存。

2.2 增长函数

  • c.push_front(elem) 在头部插入一个数据。
  • c.push_back(elem) 在尾部加入一个数据。
  • c.insert(pos,elem)在pos位置插入一个elem拷贝,传回新数据位置。
  • c.insert(pos,n,elem)在pos位置插入>n个elem数据。无返回值。
  • c.insert(pos,begin,end)在pos位置插入在[begin,end)区间的数据。无返回值。

2.3 删除函数

  • c.pop_back() 删除最后一个数据。
  • c.pop_front() 删除头部数据。
  • c.erase(pos)删除pos位置的数据,传回下一个数据的位置。
  • c.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。
  • c.clear() 移除容器中全部数据。

2.4 遍历函数

  • c.at(idx) 传回索引idx所指的数据,若是idx越界,抛出out_of_range。
  • c.front() 传回第一个数据。
  • c.back() 传回最后一个数据,不检查这个数据是否存在。
  • c.begin() 指向迭代器中的第一个数据地址。
  • c.end() 指向迭代器中的最后一个数据地址。
  • c.rbegin() 传回一个逆向队列的第一个数据。
  • c.rend() 传回一个逆向队列的最后一个数据的下一个位置。

2.5 判断函数

  • c.empty() 判断容器是否为空。

2.6 大小函数

  • c.max_size() 返回容器中最大数据的数量。
  • c.size() 返回容器中实际数据的个数。
  • c.resize(num) 从新指定队列的长度。

2.7 其余函数

  • c.assign(begin,end) 将[begin; end)区间中的数据赋值给c。
  • c.assign(n,elem) 将n个elem的拷贝赋值给c。
  • get_allocator 使用构造函数返回一个拷贝。
  • c1.swap(c2) 将c1和c2元素互换。
  • swap(c1,c2) 将c1和c2元素互换。