当前位置: 首页 > news >正文

【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底层构造
在这里插入图片描述


http://www.mrgr.cn/news/28874.html

相关文章:

  • scala的练习题
  • 如何将Nop平台与Solon框架集成
  • 【疑难杂症】电脑休眠后无法开机,进入 steamVR 时电脑突然黑屏关机
  • Git核心概念
  • go语言 分布式一致
  • 深度学习面试八股汇总
  • 算法题总结(一)——二分查找专题
  • 【Linux:命名管道】
  • 【云原生监控】Prometheus之Alertmanager报警
  • ElasticSearch-2-核心语法集群高可用实战-Week2
  • 大学生涯规划
  • 随着访问范围的扩大 OpenAI o1-mini 现已向免费用户开放
  • Makefile语法详解
  • 为什么你亏几十个点都可以扛,才赚几个点却想逃
  • 【Android】sendevent和getevent
  • day21JS-axios数据通信
  • osg中显示3dtiles和cesiumIon
  • 一键更换软件源的工具——chsrc
  • fiddler抓包02_安装
  • Chainlit集成LlamaIndex并使用通义千问模型实现AI知识库检索网页对话应用增强版
  • 经典sql题(七)查找直播间最大在线人数
  • 【算法】差分思想:强大的算法技巧
  • 【补充篇】Davinci工具要求的dbc格式
  • 访谈心脑血管名医黄力医生:医术精湛,心系患者
  • 如何提高网站搜索排名
  • AI大模型