当前位置:   article > 正文

【STL】 C++常用容器介绍系列(二)----(queue、优先队列 priority_que、deque)_c++队列容器

c++队列容器

目录

一、queue

    1、队列的主要操作包括:  

    2、队列的示例代码:

二、priority_queue

 1、大根堆与小跟堆介绍

2、priority_queue主要操作:

3、 C++ STL 中的 priority_queue 实现上述操作的示例代码:

三、deque

1、deque的操作:

2、deque完整操作代码:


一、queue

      C++中,queue(队列)是一种先进先出的数据结构,它支持在队尾插入元素,在队头删除元素。

    1、队列的主要操作包括:  

  • push(x): 将元素 x 插入到队列的末尾
  • pop(): 删除队列的第一个元素
  • front(): 返回队列的第一个元素的引用
  • back(): 返回队列的最后一个元素的引用
  • size(): 返回队列中元素的个数
  • empty(): 判断队列是否为空

    2、队列的示例代码

  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. int main() {
  5. // 定义一个队列
  6. queue<int> q;
  7. // push(x): 将元素 x 插入到队列的末尾
  8. q.push(1);
  9. q.push(2);
  10. q.push(3);
  11. // pop(): 删除队列的第一个元素
  12. q.pop();
  13. // front(): 返回队列的第一个元素的引用
  14. cout << "Front element: " << q.front() << endl;
  15. // back(): 返回队列的最后一个元素的引用
  16. cout << "Back element: " << q.back() << endl;
  17. // size(): 返回队列中元素的个数
  18. cout << "Size of queue: " << q.size() << endl;
  19. // empty(): 判断队列是否为空
  20. if (q.empty()) {
  21. cout << "Queue is empty" << endl;
  22. } else {
  23. cout << "Queue is not empty" << endl;
  24. }
  25. return 0;
  26. }

二、priority_queue

 1、大根堆与小跟堆介绍

大根堆(max heap): 在大根堆中,父节点的值始终大于或等于其子节点的值。因此,大根堆的堆顶元素是整个堆中的最大值。其实就是一个类似完全二叉搜索树的结构,调用函数top()调用最上层节点,然后大根堆最上层节点是整颗树的最大值。

如下图:

小根堆(min heap): 在小根堆中,父节点的值始终小于或等于其子节点的值。因此,小根堆的堆顶元素是整个堆中的最小值。其他与大根堆类似,只不过小根堆上层是整颗树最小值

如下图:


2、priority_queue主要操作:

  • push(x): 将元素 x 插入到优先队列中
  • pop(): 删除优先队列中具有最高优先级的元素
  • top(): 返回优先队列中具有最高优先级的元素的引用
  • size(): 返回优先队列中元素的个数
  • empty(): 判断优先队列是否为空

这个push操作有一个上滤和下滤的过程,感兴趣的同学可以看b站:https://www.bilibili.com/video/BV1AF411G7cA/?spm_id_from=333.337.search-card.all.click&vd_source=c0734847af5a3708839a9c8fde15f6c53


https://www.bilibili.com/video/BV1AF411G7cA/?spm_id_from=333.337.search-card.all.click&vd_source=c0734847af5a3708839a9c8fde15f6c53

3、 C++ STL 中的 priority_queue 实现上述操作的示例代码:

  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. int main() {
  5. // 定义一个小根堆的优先队列
  6. priority_queue<int, vector<int>, greater<int>> pq;
  7. // 需要大根堆的话这样定义
  8. priority_queue<int, vector<int>, less<int>> pq1;
  9. // push(x): 将元素 x 插入到优先队列中
  10. pq.push(3);
  11. pq.push(1);
  12. pq.push(5);
  13. // pop(): 删除优先队列中具有最高优先级的元素
  14. pq.pop();
  15. // top(): 返回优先队列中具有最高优先级的元素的引用
  16. cout << "Top element: " << pq.top() << endl;
  17. // size(): 返回优先队列中元素的个数
  18. cout << "Size of priority queue: " << pq.size() << endl;
  19. // empty(): 判断优先队列是否为空
  20. if (pq.empty()) {
  21. cout << "Priority queue is empty" << endl;
  22. } else {
  23. cout << "Priority queue is not empty" << endl;
  24. }
  25. return 0;
  26. }

三、deque

     deque(double-ended queue)是一种具有两端插入和删除操作的数据结构,它允许在队列的两端高效地进行元素的插入和删除操作。deque可以在头部和尾部同时进行插入和删除操作,因此它既可以像栈一样后进先出,也可以像队列一样先进先出。

1、deque的操作:

创建 deque 对象:使用 deque<T>` 声明一个 deque,其中 `T` 是你想要存储的元素类型。

在两端插入元素:使用 `push_back(value)` 在 deque 的尾部插入元素,并使用 `push_front(value)` 在头部插入元素。

访问元素:使用 `front()` 获取 deque 的头部元素,使用 `back()` 获取尾部元素。

获取大小:使用 `size()` 获取 deque 的大小。

迭代器访问:使用迭代器(例如 `begin()` 和 `end()`)来迭代访问 deque 中的元素。

清空 deque:使用 clear()` 方法清空 deque 中的所有元素。

检查 deque 是否为空:使用 `empty()` 方法检查 deque 是否为空。

插入元素到指定位置:使用 `insert(position, value)` 在指定位置插入元素。

删除指定位置的元素:使用 `erase(position)` 删除指定位置的元素。

2、deque完整操作代码:

  1. #include <iostream>
  2. #include <deque>
  3. using namespace std; // 使用命名空间std
  4. int main() {
  5. // 创建一个整数类型的 deque
  6. deque<int> myDeque;
  7. // 在尾部插入元素
  8. myDeque.push_back(10);
  9. // 在头部插入元素
  10. myDeque.push_front(20);
  11. // 获取头部元素
  12. int frontElement = myDeque.front();
  13. // 获取尾部元素
  14. int backElement = myDeque.back();
  15. // 获取 deque 大小
  16. size_t size = myDeque.size();
  17. // 随机访问元素
  18. int value = myDeque[1]; // 索引从 0 开始
  19. // 使用迭代器访问元素
  20. for (auto it = myDeque.begin(); it != myDeque.end(); ++it) {
  21. cout << *it << " "; // 输出每个元素
  22. }
  23. cout << endl;
  24. // 清空 deque
  25. myDeque.clear();
  26. // 判断 deque 是否为空
  27. bool isEmpty = myDeque.empty();
  28. // 在指定位置插入元素
  29. auto it = myDeque.begin() + 1;
  30. myDeque.insert(it, 30);
  31. // 删除指定位置的元素
  32. it = myDeque.begin(); // 重新设置迭代器
  33. myDeque.erase(it + 1); // 删除第二个元素
  34. return 0;
  35. }

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

闽ICP备14008679号