关于STL中deque容器的一些总结

来源:互联网 发布:网络安装公司经营范围 编辑:程序博客网 时间:2024/05/17 03:57

参考如下博客的学习总结

http://blog.csdn.net/hero_myself/article/details/52312644
http://blog.csdn.net/lsh_2013/article/details/46737877

deque的介绍

  • 双端队列deque(double ended queue)是一种随机访问的数据类型,提供了在序列两端快速插入和删除操作的功能,它可以在需要的时候改变自身大小,完成了标准的C++数据结构中队列的所有功能。
  • Vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。deque对象在队列的两端放置和删除元素是高效的,而向量vector只是在插入序列的末尾时操作才是高效的。
    • deque和vector的最大差异:
      (1)deque允许于常数时间内对头端进行元素的插入或移除操作,
      (2)deque没有所谓的capacity观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。换句话说,像vector那样“因旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间”这样的事情在deque中是不会发生的。也因此,deque没有必要提供所谓的空间预留(reserved)功能。
  • 虽然deque也提供Random Access Iterator,但它的迭代器并不是普通指针,其复杂度和vector差别很大,涉及到各个运算层面。因此,除非必要,我们应尽可能选择使用vector而非deque。对deque进行的排序操作,为了最高效率,可将deque先完整复制到一个vector身上,将vector排序后(利用STL的sort算法),再复制回deque。
  • deque是一种优化了的对序列两端元素进行添加和删除操作的基本序列容器。通常由一些独立的区块组成,第一区块朝某方向扩展,最后一个区块朝另一方向扩展。它允许较为快速地随机访问但它不像vector一样把所有对象保存在一个连续的内存块,而是多个连续的内存块。并且在一个映射结构中保存对这些块以及顺序的跟踪。

创建deque对象

  1. deque();
    //创建一个没有任何元素的deque对象。
  2. deque(size_typen);
    //创建一个具有n个元素的deque对象,每个元素采用它的类型下的默认值。
  3. deque(size_type n, constT& value);
    //创建一个具有n个元素的deque对象,这些元素的初始值为value。
  4. deque(const deque&);
    //deque的拷贝构造函数,通过拷贝一个deque对象的元素值,创建一个新的deque对象。
  5. deque(constInputIterator first, const InputIterator last, const A& a=A());
    //将迭代区间[first,last)所指的元素拷贝到一个新创建的deque对象中,其中内存分配器可缺省。
#include<deque> //头文件deque<int> d; deque<int> d(10);//deque对象d有10个元素,每个元素初始值为0。  deque<double> d(10,5);  deque<char> d1(5,’a’);  deque<char> d2(d1);  //利用int数组iArray,创建一个deque对象d  int iArray[]={1,2,3,4,5,6,7};  deque<int> d(iArray, iArray+7);  

deque的成员函数

  1. deq[ ]:用来访问双向队列中单个的元素。
  2. deq.front():返回第一个元素的引用。
  3. deq.back():返回最后一个元素的引用。
  4. deq.push_front(x):把元素x插入到双向队列的头部。
  5. deq.pop_front():弹出双向队列的第一个元素。
  6. deq.push_back(x):把元素x插入到双向队列的尾部。
  7. deq.pop_back():弹出双向队列的最后一个元素。
  8. deq.insert(iterator pos, const T& x);//pos位置之前,插入新元素x
  9. iterator erase(iteratorpos); //删除pos所指向的元素
  10. iterator erase(iterator first, iterator last);//删除迭代区间[first,last)所指向的所有元素
  11. void clear();//删除所有元素

元素的遍历访问

分别用数组方式迭代器方式访问deque元素。

#include <deque>  #include <iostream>     using namespace std;   int main(void)  {      deque<int> d;      int i;      d.push_back(13);      d.push_back(32);      d.push_back(29);      cout<<"数组方式访问deque元素:"<<endl;      for(i=0; i < d.size(); i++)          cout << "d[" << i << "] = " << d[i] << endl;        deque<int>::iterator j,jend;//定义迭代器      jend=d.end();      cout<<"迭代器访问deque元素:"<<endl;      for (i=0,j=d.begin(); j!=jend;i++,j++)      {          cout << "d[" << i << "] = " << *j << endl;       }      return 0;}

元素的插入

由于deque使用了两个迭代器分别指向双端队列的首尾,因此deque具有高效的头部插入元素的函数push_front()。中间位置的插入用insert()函数。
void push_front(constT&);//头部插入
iterator insert(iterator pos, const T& x);//pos位置之前,插入新元素x

#include <deque>  #include <iostream>  using namespace std;  int main(void)  {         deque<int> d;      d.push_back(6);      d.push_back(7);         //头部插入      d.push_front(5);      for(int i=0; i<d.size(); i++)  //打印6 7          cout << d[i] << ' ';      cout << endl;      //中间位置插入      d.insert(d.begin() +1 ,9);     //在第个元素前插入,即9 6 7      for(int j=0; j<d.size(); j++)          cout << d[j] << ' ';      cout << endl;      return 0;  }  

元素的删除

deque容器提供了删除首元素的pop_front函数,删除尾元素的pop_back函数,删除任意位置或迭代区间上元素的erase函数,以及删除所有元素的clear函数。

#include <deque>  #include <iostream>  using namespace std;  int main(void)  {         deque<int> d;      d.push_back(4);      d.push_back(5);      d.push_back(1);      d.push_back(1);      d.push_back(1);      d.push_back(6);      for(int i=0; i<d.size(); i++)          cout << d[i] << ' ' ;      cout << endl;      //头尾和任意位置删除元素      d.erase(d.begin() +1);      d.pop_front();      d.pop_back();      for(int j=0; j<d.size(); j++)          cout << d[j] << ' ' ;      cout << endl;      //删除所有元素      d.clear();      cout << "执行clear()" <<endl << "deque元素全部清除" << endl;      return 0;  }
原创粉丝点击