天天看点

c++---deque的使用

  1. deque的介绍
  2. deque的使用
  3. deque的应用

一, deque的介绍及使用

  • deque的介绍
  1. deque(发音类似“deck”),是双端队列不规则的首字母缩写,双端队列是动态大小的序列式容器,其可 以像两端进行伸缩。
  2. 特定的库可以以不同的方式实现deque,但通常都是一种动态数组。不论在何种情况下,它都允许通过 随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩。
  3. 因此,deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插入和删除操作更加高 效。与vector不同的是,deque不能保证所有的元素存储在连续的空间中,在deque中通过指针加偏移 量方式访问元素可能会导致非法的操作。
  4. vector与list提供了相似的接口,因此其具有类似的用途,但是内部的实现原理不同:vector使用使用了 动态数组,该数组通常需要动态增长;deque中的元素可能分散在不同的存储块中,在deque中保存了 一些必要的信息,通常用来在常数范围内直接访问deque中的任何一个元素,所以deque的内部实现比 vector复杂,但是这些额外信息使得dque在某些情况下增长更加的高效,特别是在序列比较大,重新分 配成本比较高的情况下。
  5. 除了在频繁在头部或尾部进行插入和删除操作外,deque比list和forward_list的性能更差。
c++---deque的使用

二,deque的使用

  • deque的构造
deque()//构造空的双端队列
deque(n,val=value type());//用n个值为val的元素构造双端队列
deque(InputIterator first, InputIterator last);//用[first, last)的区间构造双端队列
deque(const deque& x);//双端队列的拷贝构造函数
           
  • deque的迭代器、
    c++---deque的使用
    deque的迭代器双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”的假象,落在了deque的 迭代器身上。下图为deque的原理图:
    c++---deque的使用
[begin(), end()()) ;//begin:容器起始位置   end最后一个元素下一个位置
[rbegin(), rend()) ;//反向迭代器rbegin在end位置,rend在begin
[cbegin(), cend()) ;//const迭代器,与begin和end位置相同,但不能修改其空间内容
[crbegin(), crend()) ;//const反向迭代器,与crbegin在cend位置,crend在cbegin位置
           
  • deque的容量操作
size();//返回deque有效元素的个数
empty();//检测deque是否为空,是返回true,否则返回false
resize();//将deque中的元素改变到sz,多处的空间用value填充
           
  • deque的元素访问操作
operator[];//返回deque中n位置上元素的引用
front();//返回deque中首元素的引用
back();//返回deque中最后一个元素的引用
           
  • deque中修改操作
push_back() ;
pop_back() ;//deque的尾插和尾删 
push_front() ;
 pop_front() ;//deque任意位置插入和删除
insert(pos, value) ;
 erase(pos); 删除deque头部元素
swap() ;交换两个deque中的内容
clear() ;将deque中的元素清
           

例子:

#include <iostream>
#include <deque>
using namespace std;
int main(){
	deque<int>q;//构造一个空的deque
	q.push_back(1);//尾插1 2 3
	q.push_back(2);
	q.push_back(3);
	deque<int>::iterator be = q.begin();
	while (be != q.end()){
		cout << *be << endl;
		be++;
	}
	cout << q.front() << endl;
	cout << q.back() << endl;
	q.push_front(0);
	deque<int>::reverse_iterator be1 = q.rbegin();
	while (be1 != q.rend()){
		cout << *be1 << endl;
		be1++;
	}

	system("pause");
	return EXIT_SUCCESS;
}
           

三,deque的应用场景

deque再序列式容器中比较鸡肋,因为如果只是简单的存储元素,使用vector即可,如果对元素任意位置进行插入或者删除操作比较多,使用list即可,所以一般对deque很少去使用。deque最大的应用就是作为标准库中stack和queue的底层结构。