当前位置:   article > 正文

搞清c++中的队列(queue)以及双端队列(deque),以及常用的接口!_c++ deque push

c++ deque push

1. 队列

概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口

 

特征: 

队列容器允许从一端新增元素,从另一端移除元素

队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为

队列中进数据称为 --- 入队 push

队列中出数据称为 --- 出队 pop

队列(Queue)常用的接口

构造函数:

  • queue<T> que; //queue采用模板类实现,queue对象的默认构造形式

  • queue(const queue &que); //拷贝构造函数

赋值操作:

  • queue& operator=(const queue &que); //重载等号操作符

数据存取:

  • push(elem); //往队尾添加元素

  • pop(); //从队头移除第一个元素

  • back(); //返回最后一个元素

  • front(); //返回第一个元素

大小操作:

  • empty(); //判断堆栈是否为空

  • size(); //返回栈的大小

下面举一个例子,展示队列的用法

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<iostream>
  3. #include<queue>
  4. using namespace std;
  5. int main()
  6. {
  7. //创建队列
  8. queue<int> que;
  9. //push(elem)
  10. que.push(1);
  11. que.push(2);
  12. que.push(3);
  13. int i = 1;
  14. while (!que.empty())
  15. {
  16. printf("队列第%d个元素=> %d\n", i,que.front());
  17. i++;
  18. que.pop();
  19. }
  20. return 0;
  21. }
  • 入队 --- push

  • 出队 --- pop

  • 返回队头元素 --- front

  • 返回队尾元素 --- back

  • 判断队是否为空 --- empty

  • 返回队列大小 --- size

2. 双端队列

双端队列最适合的是频繁的元素的插入和删除,对于遍历没有vector容器的好

  • 相对于队列的不同:双端数组,可以对头端进行插入删除操作,和随机访问(遍历),不同位置的插入和删除,排序操作

deque与vector区别:

  • vector对于头部的插入删除效率低,数据量越大,效率越低

这是因为vector每次头部的插入都会将元素后移一位,每次操作都是O(N)的时间

  • deque相对而言,对头部的插入删除速度回比vector快

这是因为vector内部是一片连续的空间访问速度快

而deque内部由中控器来维护,中控器存放的是每个缓冲区的地址,所以看起来是个连续的空间,其实每次你访问的都是缓冲区的地址,再根据地址寻找对应缓冲区的值

  • vector访问元素时的速度会比deque快,这和两者内部实现有关

deque的构造函数

  • deque<T> deqT; //默认构造形式

  • deque(beg, end); //构造函数将[beg, end)区间中的元素拷贝给本身。

  • deque(n, elem); //构造函数将n个elem拷贝给本身。

  • deque(const deque &deq); //拷贝构造函数

  1. #include <deque>
  2. //通过迭代器循环遍历
  3. void printDeque(const deque<int>& d)
  4. {
  5. for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
  6. cout << *it << " ";
  7. }
  8. cout << endl;
  9. }
  10. int main() {
  11. deque<int> d1; //无参构造函数
  12. for (int i = 0; i < 10; i++)
  13. {
  14. d1.push_back(i);
  15. }
  16. printDeque(d1);
  17. deque<int> d2(d1.begin(),d1.end());
  18. printDeque(d2);
  19. deque<int>d3(10,100);
  20. printDeque(d3);
  21. deque<int>d4 = d3;
  22. printDeque(d4);
  23. return 0;
  24. }

deque的大小操作

  • deque.empty(); //判断容器是否为空

  • deque.size(); //返回容器中元素的个数

  • deque.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

    //如果容器变短,则末尾超出容器长度的元素被删除。

  • deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。//如果容器变短,则末尾超出容器长度的元素被删除。

  1. #include <deque>
  2. void printDeque(const deque<int>& d)
  3. {
  4. for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
  5. cout << *it << " ";
  6. }
  7. cout << endl;
  8. }
  9. int main() {
  10. deque<int> d1;
  11. for (int i = 0; i < 10; i++)
  12. {
  13. d1.push_back(i);
  14. }
  15. printDeque(d1);
  16. //判断容器是否为空
  17. if (d1.empty()) {
  18. cout << "d1为空!" << endl;
  19. }
  20. else {
  21. cout << "d1不为空!" << endl;
  22. //统计大小
  23. cout << "d1的大小为:" << d1.size() << endl;
  24. }
  25. //重新指定大小
  26. d1.resize(15, 1);
  27. printDeque(d1);
  28. d1.resize(5);
  29. printDeque(d1);
  30. return 0;
  31. }

deque的插入和删除

两端插入操作:

  • push_back(elem); //在容器尾部添加一个数据

  • push_front(elem); //在容器头部插入一个数据

  • pop_back(); //删除容器最后一个数据

  • pop_front(); //删除容器第一个数据

指定位置插入:

  • insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。

  • insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。

  • insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。

指定位置删除:

  • clear(); //清空容器的所有数据

  • erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。

  • erase(pos); //删除pos位置的数据,返回下一个数据的位置。

  1. #include <deque>
  2. void printDeque(const deque<int>& d)
  3. {
  4. for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
  5. cout << *it << " ";
  6. }
  7. cout << endl;
  8. }
  9. //两端操作
  10. void test01()
  11. {
  12. deque<int> d;
  13. //尾插
  14. d.push_back(10);
  15. d.push_back(20);
  16. //头插
  17. d.push_front(100);
  18. d.push_front(200);
  19. printDeque(d);
  20. //尾删
  21. d.pop_back();
  22. //头删
  23. d.pop_front();
  24. printDeque(d);
  25. }
  26. //插入
  27. void test02()
  28. {
  29. deque<int> d;
  30. d.push_back(10);
  31. d.push_back(20);
  32. d.push_front(100);
  33. d.push_front(200);
  34. printDeque(d);
  35. d.insert(d.begin(), 1000);
  36. printDeque(d);
  37. d.insert(d.begin(), 2,10000);
  38. printDeque(d);
  39. deque<int>d2;
  40. d2.push_back(1);
  41. d2.push_back(2);
  42. d2.push_back(3);
  43. d.insert(d.begin(), d2.begin(), d2.end());
  44. printDeque(d);
  45. }
  46. //删除
  47. void test03()
  48. {
  49. deque<int> d;
  50. d.push_back(10);
  51. d.push_back(20);
  52. d.push_front(100);
  53. d.push_front(200);
  54. printDeque(d);
  55. d.erase(d.begin());
  56. printDeque(d);
  57. d.erase(d.begin(), d.end());
  58. d.clear();
  59. printDeque(d);
  60. }
  61. int main() {
  62. //test01();
  63. //test02();
  64. test03();
  65. return 0;
  66. }

deque的排序

依然可以用sort方法对双端队列进行排序sort(迭代的起始位置,迭代的终止位置,自定义比较函数)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/975206
推荐阅读
相关标签
  

闽ICP备14008679号