C++学习笔记之STL标准库(五)deque双端队列

  deque 即双端队列,全名double-ended queue。是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在序列的两端进行。这两端分别称做端点1和端点2。在实际使用中,还可以有 输出受限的双端队列(即一个端点允许插入和删除,另一个端点只允许插入的双端队列)和 输入受限的双端队列(即一个端点允许插入和删除,另一个端点只允许删除的双端队列)。而如果限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻的栈了。

  双端队列是除向量vector外唯一一个支持随机存取迭代器的容器。但它在一个方面比vector做的好,可以在被控序列的开始处以常数时间插入或删除元素,当然,它也支持在序列的末端以常数时间做插入和删除,但在尾端的操作和vector没有什么区别。

  为了能够在两端都可以高效的插入删除元素,双端队列在某个偏移量off处开始其有效内容,它把序列的长度存在另一个整数size中。假如我们没有在被控序列的中间插入或删除元素,那么即使对它的任意一端进行了插入或删除元素,原有的迭代器还是能够继续的指向它原来所指向的元素。

  双端队列可以像列表一样很好的实现先进先出(FIFO)队列或后进先出(LIFO)队列(即栈)。与列表list进行比较,如果我们需要对被控序列的元素进行随机存取,那么deque是远胜于list的;如果我们希望频繁的在任意位置插入新元素,双端队列需要的时间是线性的,而list需要的时间仅为常数。

  双端队列与vector比较,虽然在所有的操作中,双端队列的效率比vector非平即胜,但是双端队列比向量vector需要更多的存储空间的开销,并且在双端队列中任意存取一个元素所需的时间还是比vector多很多。

  因此,可以把双端队列deque看做是向量vector和列表list的一个折中。如果对于给定应用程序中的大部分操作,其时间复杂度在能够接受的范围内,那么最好选用vector或list中的一个;如果需要在效率和效率引入的复杂度之间维持平衡,那么推荐选择双端队列deque。

包含头文件 #include <deque>  声明命名空间 using namespace std;

1)构造函数

  deque(); //创建一个空的deque 如:deque<int> a;

  deque(int nSize); //创建一个空的deque,元素个数为nSize 如:deque<int> a(10);

  deque(int nSize,const T& val); //创建一个deque,元素个数为nSize,且值都为val 如:deque<string> a(5,"have fun");

  deque(const deque&); //拷贝(复制)构造函数

    如:deque<string> a(5,"have fun"); 

      deque<string> b(a);

  deque(begin,end); //复制另一个数组[begin,end)区间内的元素到deque中

    如:int ia[6] = { -2, -1, 0, 1, 2, 1024 }; 

      deque<int> a(ia,ia+6);

2)插值取值函数

  void push_front(const T& val); //双端队列头部增加一个元素val

  void push_back(const T& val); //双端队列尾部增加一个元素val

  void pop_front(); //删除双端队列的第一个元素,双端队列不能为空

  void pop_back(); //删除双端队列的最后一个元素,双端队列不能为空

  void assign(size_type n,const T& x); //重置双端队列,把双端队列设置为由n个元素组成的值为x的新双端队列

  void assign(const_iterator first,const_iterator last); //重置双端队列,把双端队列中[first,last)的元素设置成当前元素

  iterator insert(iterator it,const T& x); //双端队列中迭代器指向元素前增加一个元素x

  iterator insert(iterator it,int n,const T& x); //双端队列中迭代器指向元素前增加n个相同的元素x

  iterator insert(iterator it,const_iterator first,const_iterator last); //双端队列中迭代器指向元素前插入另一个相同类型双端队列的[first,last)间的数据

3)删除元素

  iterator erase(iterator it); //删除双端队列中迭代器指向元素;

  iterator erase(iterator first,iterator last); //删除双端队列中[first,last)中元素,注意last是指向要删除的最后一个元素的下一个元素;

  void clear(); //清空双端队列中所有元素,功能等同于erase(deque.begin(),deque.end());

4)遍历函数

  reference front(); //返回首元素的引用

  reference back(); //返回尾元素的引用

  iterator begin(); //返回双端队列头指针,指向第一个元素

  iterator end(); //返回双端队列尾指针,指向双端队列最后一个元素的下一个位置

  reverse_iterator rbegin(); //反向迭代器,指向最后一个元素

  reverse_iterator rend(); //反向迭代器,指向第一个元素之前的位置

  reference at(size_type pos); //随机存取pos位置的元素

  reference operator[](size_type pos); //随机存取pos位置的元素

5)判断函数

  bool empty() const:判断双端队列是否为空,若为空,则返回true

6)大小函数

  void resize(size_type n); //将双端队列的元素调整到n个,多删少补,值随机

  void resize(size_type n,T& x); //将双端队列的元素调整到n个,多删少补,值为x

  int size() const; //返回当前双端队列中元素的个数

  int max_size() const; //返回最大可允许的deque元素数量值

7)其他函数

  void swap(deque& x); //交换两个deque中的元素

猜你喜欢

转载自www.cnblogs.com/jason-20160301/p/8882188.html