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元素互换。