您的位置:首页 > 新闻 > 热点要闻 > 【C++】——优先级队列和容器适配器

【C++】——优先级队列和容器适配器

2025/2/27 21:39:39 来源:https://blog.csdn.net/super_coders/article/details/142316567  浏览:    关键词:【C++】——优先级队列和容器适配器

文章目录

  • 优先级队列
  • 容器适配器

优先级队列

优先级队列是一种特殊的队列,他的元素出队列顺序并不按照先进先出原则,而是根据元素的优先级来。优先级高的先出,优先级低的后出。(类似于堆)
优先级队列常用成员函数:

  1. empty():检查队列是否为空。
  2. size():返回队列中的元素数量。
  3. top():返回队列顶部(优先级最高)的元素,但不从队列中删除它。
  4. push():将一个元素添加到队列中,并重新调整队列以保持排序。
  5. pop():删除队列顶部(优先级最高)的元素。
  6. swap():与另一个优先级队列交换内容

用例:

#define   _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main()
{priority_queue<int> pq;//priority_queue<int, std::vector<int>, std::less<int>> pq;pq.push(2);pq.push(1);pq.push(6);pq.push(4);pq.push(9);while (!pq.empty()){cout << pq.top() << " ";pq.pop();}cout << endl;priority_queue<int, std::vector<int>, std::greater<int>> pq1;pq1.push(2);pq1.push(1);pq1.push(6);pq1.push(4);pq1.push(9);while (!pq1.empty()){cout << pq1.top() << " ";pq1.pop();}cout << endl;return 0;
}

在这里插入图片描述

容器适配器

C++中三种常见的容器适配器有stack、queue、priority_queue

stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可 以作为stack的底层容器,比如vector和list都可以
queue是先进先出的特殊线性数据结构,只要具有 push_back和pop_front操作的线性结构,都可以作为queue的底层容器比如:list

在这里插入图片描述

deque容器是什么,stack和queue为什么在底层设计时用deque来实现?

在这里插入图片描述
deque是一个在两端都能进行快速插入和删除操作的数据结构。看起来像是vector和list的合体,按道理来说1 + 1 > 1
那为什么还用学习vector和list,直接学deque多方便

deque的缺点

  1. 内存占用较大:
    如下图所示,deque需要维护多个缓冲区(或称为段),这些缓冲区之间通过指针或引用相互连接。这种非连续存储的方式虽然提高了在两端操作的效率,但也导致了额外的内存开销,因为需要存储这些指针或引用。因此,deque的内存占用通常会比vector大。
  2. 中间插入或删除操作效率较低:
    尽管deque在两端进行插入或删除操作的时间复杂度为O(1),但在中间位置进行这些操作时,效率并不高。因为需要找到正确的段并可能移动段内的元素,或者在某些情况下甚至需要合并或拆分段,这可能导致时间复杂度增加到O(n)。相比之下,list在中间位置进行插入或删除操作时更加高效。
  3. 遍历麻烦(致命缺陷):
    在遍历时,deque的迭代器要频繁的去检测其是否移动到 某段小空间的边界,导致效率低下,但是一般用到这种线性结构存储的都会需要遍历,所以deque在平时就用不到

deque底层构造
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com