1、Deque

(1)定义

deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容。deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入数据:push_front()。

(2)底层实现

deque 即双端队列。是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。

双端队列是限定插入和删除操作在表的两端进行的线性表。这两端分别称做端点1和端点2。也可像栈一样,可以用一个铁道转轨网络来比喻双端队列。在实际使用中,还可以有输出受限的双端队列(即一个端点允许插入和删除,另一个端点只允许插入的双端队列)和输入受限的双端队列(即一个端点允许插入和删除,另一个端点只允许删除的双端队列)。而如果限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻的栈了。

(3)使用

使用deque容器之前必须加上<deque>头文件:#include<deuqe>。

deque属于std命名域的内容,因此需要通过命名限定:using std::deque;也可以直接使用全局的命名空间方式:using namespace std。

(4)特点

优点:(1)随机访问,即[]操作和deque.at();

(2)插入与删除方便;

(3)可在双端进行pop,push。

缺点:占用内存多。

2、成员函数

(1)构造函数

  1. /*构造函数*/
  2. deque<Elem> c
  3. //创建一个空的deque
  4. deque<Elem> c1(c2)
  5. //复制一个deque。
  6. deque<Elem> c(n)
  7. //创建一个deque,含有n个数据,数据均已缺省构造产生。
  8. deque<Elem> c(n, elem)
  9. //创建一个含有n个elem拷贝的deque。
  10. deque<Elem> c(beg,end)
  11. //创建一个以[beg;end)区间的deque。
  12. ~deque<Elem>()
  13. //销毁所有数据,释放内存。

(2)赋值操作

  1. c.assign(n,num);
  2. //将n个num拷贝复制到容器c
  3. c.assign(beg,end)将[beg,end);
  4. //区间的数据拷贝复制到容器c

示例:

  1. deque<int> d1 {1,2,3,4,5},d2;
  2. d2.assign(2, 8);
  3. deque<int>::iterator it;
  4. cout << "d2.assign(n,num):";
  5. for(it=d2.begin();it!=d2.end();it++){
  6. cout << *it << " ";
  7. }
  8. d2.assign(d1.begin(), d1.begin()+3);
  9. cout << "d2.assign(beg,end):";
  10. for(it=d2.begin();it!=d2.end();it++){
  11. cout << *it << " ";
  12. }
  13. cout << endl;

(3)插入操作

  1. c.push_back(num)在末尾位置插入元素
  2. c.pop_back()删除末尾位置的元素
  3. c.push_front(num)在开头位置插入元素
  4. c.pop_front()删除开头位置的元素
  5.  
  6. c.insert(pos,num)在pos位置插入元素num
  7. c.insert(pos,n,num)在pos位置插入n个元素num
  8. c.insert(pos,beg,end)在pos位置插入区间为[beg,end)的元素

示例:

  1. deque<int> d {1,2,3,4,5};
  2. deque<int>::iterator it;
  3. cout << "insert before:" ;
  4. for(it=d.begin();it!=d.end();it++){
  5. cout << *it << " ";
  6. }
  7. cout << endl;
  8. d.insert(d.end(),22);
  9. d.insert(d.end(), 3,88);
  10. int a[5] = {1,2,3,4,5};
  11. d.insert(d.begin(),a,a+3);
  12. cout << "insert after:" ;
  13. for(it=d.begin();it!=d.end();it++){
  14. cout << *it << " ";
  15. }
  16. cout << endl;
  17.  
  18. deque<int> d {1,2,3,4,5};
  19. d.push_back(10);
  20. deque<int>::iterator it;
  21. cout << "push_back(num):" ;
  22. for(it=d.begin();it!=d.end();it++){
  23. cout << *it << " ";
  24. }
  25. cout << endl;
  26.  
  27. d.pop_back();
  28. cout << "pop_back(num):" ;
  29. for(it=d.begin();it!=d.end();it++){
  30. cout << *it << " ";
  31. }
  32. cout << endl;
  33.  
  34. d.push_front(10);
  35. cout << "push_front(num):" ;
  36. for(it=d.begin();it!=d.end();it++){
  37. cout << *it << " ";
  38. }
  39. cout << endl;
  40.  
  41. d.pop_front();
  42. cout << "pop_front(num):" ;
  43. for(it=d.begin();it!=d.end();it++){
  44. cout << *it << " ";
  45. }
  46. cout << endl;
  47. return 0;

(4)删除操作

  1. c.clear()清除c容器中拥有的所有元素
  2.  
  3. c.erase(pos)删除pos位置的元素c.erase(beg,end)删除区间为[beg,end)的元素
  4. c.erase(beg,end)删除区间为[beg,end)之间的元素

示例:

  1. deque<int> d {1,2,3,4,5};
  2. deque<int>::iterator it;
  3. cout << "clear before:" ;
  4. for(it=d.begin();it!=d.end();it++){
  5. cout << *it << " ";
  6. }
  7. cout << endl;
  8. d.clear();
  9. cout << "clear after:" ;
  10. for(it=d.begin();it!=d.end();it++){
  11. cout << *it << " ";
  12. }
  13. cout << endl;
  14.  
  15. deque<int> d {1,2,3,4,5};
  16. d.erase(d.begin());
  17. deque<int>::iterator it;
  18. cout << "erase(pos) after:" ;
  19. for(it=d.begin();it!=d.end();it++){
  20. cout << *it << " ";
  21. }
  22. cout << endl;
  23. d.erase(d.begin(), d.begin()+3);
  24. cout << "erase(beg,end) after:" ;
  25. for(it=d.begin();it!=d.end();it++){
  26. cout << *it << " ";
  27. }
  28. cout << endl;

(5)定位操作

  1. c.begin()返回指向第一个元素的迭代器
  2. c.end()返回指向最后一个元素下一个位置的迭代器
  3.  
  4. c.rbegin()返回指向反向队列的第一个元素的迭代器(即原队列的最后一个元素)
  5. c.rend()返回指向反向队列的最后一个元素的下一个位置(即原队列的第一个元素的前一个位置)
  6.  
  7. c.at(pos)返回索引为pos的位置的元素,会执行边界检查,如果越界抛出out_of_range异常
  8.  
  9. c.front()返回c容器的第一个元素
  10. c.back()返回c容器的最后一个元素

示例:

  1. deque<int> d {1,2,3,4,5};
  2. deque<int>::iterator it;
  3. for(it=d.begin();it!=d.end();it++){
  4. cout << *it << " ";
  5. }
  6. cout << endl;
  7.  
  8. deque<int> d {1,2,3,4,5};
  9. deque<int>::reverse_iterator it;
  10. for(it=d.rbegin();it!=d.rend();it++){
  11. cout << *it << " ";
  12. }
  13. cout << endl;
  14.  
  15. deque<int> d {1,2,3,4,5};
  16. cout << "d.at(pos):" << d.at(2);
  17. return 0;
  18.  
  19. deque<int> d {1,2,3,4,5};
  20. if(!d.empty()){
  21. cout << "d.front():" << d.front() << endl;
  22. cout << "d.back(): " << d.back() << endl;
  23. }

(6)数据大小

  1. c.empty()判断c容器是否为空
  2. c.size()返回c容器中实际拥有的元素个数
  3. c.max_size()返回c容器可能存放元素的最大数量
  4. c.resize(num)从新定义容器的大小

示例:

  1. deque<int> d {1,2,3,4,5};
  2. if(!d.empty()){
  3. cout << "d is not empty!" << endl;
  4. }else{
  5. cout << "d is empty!" << endl;
  6. }
  7. return 0;
  8.  
  9. deque<int> d {1,2,3,4,5};
  10. cout << "d.size():" << d.size() << endl;
  11. return 0;
  12.  
  13. deque<int> d {1,2,3,4,5};
  14. cout << "d.max_size():" << d.max_size() << endl;
  15. return 0;
  16.  
  17. deque<int> d {1,2,3,4,5};
  18. cout << "d.size():" << d.size() << endl;
  19. d.resize(d.size()+5);
  20. cout << "d.resize() after:" << d.size() <<endl;
  21. deque<int>::iterator it;
  22. cout << "resize() after:" ;
  23. for(it=d.begin();it!=d.end();it++){
  24. cout << *it << " ";
  25. }
  26. cout << endl;

(7)交换操作

  1. c1.swap(c2)交换容器c1,c2;
  2. swap(c1,c2)同上。

示例:

  1. deque<int> d1 {1,2,3,4,5},d2,d3;
  2. d1.swap(d2);
  3. deque<int>::iterator it;
  4. cout << "d1 swap after:" ;
  5. for(it=d1.begin();it!=d1.end();it++){
  6. cout << *it << " ";
  7. }
  8. cout << endl;
  9. cout << "d2 swap after:" ;
  10. for(it=d2.begin();it!=d2.end();it++){
  11. cout << *it << " ";
  12. }
  13. cout << endl;
  14.  
  15. swap(d3,d2);
  16. cout << "d3 swap after:" ;
  17. for(it=d3.begin();it!=d3.end();it++){
  18. cout << *it << " ";
  19. }
  20. cout << endl;

(8)重载运算符

  1. operator==
  2. operator!=
  3. operator<
  4. operator<=
  5. operator>
  6. operator>=

示例:

  1. deque<int> d1 {1,2,3,4,5},d2;
  2. d2 = d1;
  3. deque<int>::iterator it;
  4. for(it=d2.begin();it!=d2.end();it++){
  5. cout << *it << " ";
  6. }
  7. cout << endl;

  

Deque 容器的更多相关文章

  1. STL学习三:deque容器

    1.Deque简介 deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的. deque在接口上和vector非常 ...

  2. STL学习系列三:Deque容器

    1.Deque简介 deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的. deque在接口上和vector非常 ...

  3. vector,list,deque容器的迭代器简单介绍

    我们知道标准库中的容器有vector,list和deque.另外还有slist,只不过它不是标准容器.而谈到容器,我们不得不知道进行容器一切操作的利器---迭代器.而在了解迭代器之前,我们得先知道每个 ...

  4. 带你深入理解STL之Deque容器

    在介绍STL的deque的容器之前,我们先来总结一下vector和list的优缺点.vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操 ...

  5. STL之Deque容器

    1.Deque容器 1)deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的. 2)deque在接口上和vect ...

  6. STL Deque 容器

    STL Deque 容器 Deque简介 deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双 端的,而vector是单端的.         ...

  7. C++——STL之vector, list, deque容器对比与常用函数

    STL 三种顺序容器的特性对比: vector 可变数组,内存空间是连续的,容量不会进行缩减.支持高效随机存取,即支持[]和at()操作.尾部插入删除效率高,其他位置插删效率较低: list 双向链表 ...

  8. c++ deque 容器

    deque (全名 double ended queue)是一种具有队列和栈一样的数据结构. 在c++标准库中几乎和vector容器的接口完全相同,但它和vector 还是有一些细微的差别. 1. d ...

  9. deque容器

    一.deque容器基本概念 deque是“double-ended queue”的缩写,和vector一样,deque也支持随机存取.vector是单向开口的连续性空间,deque则是一种双向开口的连 ...

  10. [转]STL之deque容器详解

    Deque 容器 deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容.deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中 ...

随机推荐

  1. python字符串的学习计划

    python字符串有14小节内容, 计划7天学完吧(不知道能完成不) 今天依然是在禅道上写用例的一天 禅道上的用例,编写的时候比较方便 修改维护的时候,有点小麻烦(没有在Excel表中容易修改) D5 ...

  2. Java课堂疑问解答与思考5

    一:运行 TestInherits.java 示例,观察输出,总结. TestInherits.java class Grandparent { public Grandparent() { Syst ...

  3. MySQL学习-数据库设计以及sql的进阶语句

    1.数据库设计 关系型数据库建议在E-R模型的基础上,我们需要根据产品经理的设计策划,抽取出来模型与关系,制定出表结构,这是项目开始的第一步 在开发中有很多设计数据库的软件,常用的如power des ...

  4. 梳理检测论文-Refinement Neural Network

    Single-Shot Refinement Neural Network for Object Detection 目录 1. motivation 2. RefineDet 解析(Network ...

  5. switch条件变量的取值类型

    switch条件变量的取值类型主要有以下六种: 1)JDK1.5(不含JDK1.5)之前只能是byte.short.int.char类型,不能是float.double.long.boolean类型. ...

  6. 杭州集训Day5

    下面是Day5的题目!(其实都咕了好几天了 100+70+40=210. T1 皇后 XY 的疑难 (1s 512MB) 1.1 题目描述 有一个n*n的王国城堡地图上,皇后XY喜欢看骑士之间的战斗, ...

  7. go io库

    1 io.Reader和io.Writer的获取 tcp协议下的io.Reader是从conn中获取到的,因为要先建立conn,conn建立成功之后,然后读写数据. 2 真正的读写 2.1 io.Co ...

  8. JS之理解继承

    JS之理解继承:https://segmentfault.com/a/1190000010468293 1.call继承,也叫借用构造函数.伪造对象或是经典继承.call继承回把父类的私有属性和方法继 ...

  9. SQL查询结果列拼接成逗号分隔的字符串:group_concat

    转自:SQL查询结果列拼接成逗号分隔的字符串 背景:做SQL查询时会经常需要,把查询的结果拼接成一个字符串. 解决方法: 通过 group_concat 函数 拼接的结果很长,导致拼接结果显示不全,可 ...

  10. SharePoint自己定义程序页面部署 不用重新启动IIS

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/dz45693/article/details/30840255 SharePoint的部署方式默认是 ...