C++ STL - 优先级队列及其模拟实现

目录

0. 引言

1. priority_queue 介绍 

1.1 构造函数 

1.2 priority_queue 接口函数使用 

1.3 仿函数 

 1.4 题目练习

 2. priority_queue 模拟实现

2.1基本框架:

2.2 默认构造函数

2.3 基本函数

2.4 堆的向上以及向下调整


0. 引言

优先队列 (priority_queue) 是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列和堆本质是一样的,以数组形式存储的完全二叉树。

1. priority_queue 介绍 

1.1 构造函数 

我们可以看到有两种构造方式,一个是构造一个空对象,另一个是通过迭代器的区间来构造,默认的构造出的是大堆

priority_queue<int> pq1; //直接构造空对象

接下来我们分别以大堆和小堆的方式来构造对象:

	vector<int> v1 = {3,2,7,6,0,4,1,9,8,5};priority_queue<int, vector<int>, less<int>> pq1(v1.begin(), v1.end());//less-大堆while (!pq1.empty()){cout << pq1.top() << " ";pq1.pop();}cout << endl;priority_queue<int, vector<int>, greater<int>> pq2(v1.begin(), v1.end());//greater-小堆while (!pq2.empty()){cout << pq2.top() << " ";pq2.pop();}cout << endl;priority_queue<int> pq3(v1.begin(), v1.end());//默认大堆while (!pq3.empty()){cout << pq3.top() << " ";pq3.pop();}cout << endl;

因此我们得出: less - 大堆, greater - 小堆。 

1.2 priority_queue 接口函数使用 

接口函数主要包括以下:

函数说明
empty检测优先级队列是否为空,是返回true,否则返回 false
top返回优先级队列中最大(最小元素),即堆顶元
push在优先级队列中插入元素x
pop删除优先级队列中最大(最小)元素,即堆顶元素

1.3 仿函数 

仿函数又名函数对象 function objects 仿函数的主要作用是借助类和运算符重载,做到同一格式兼容所有函数。由于模板将 less 用作大堆,而 greater 用做小堆,是在有点别扭,如果是我们自己实现仿函数的化,肯定会按照习惯来写,less 表示小堆,greater 表示大堆。例如:

template<class T>
struct less
{bool operator()(const T& x, const T& y){return x < y;}
};template<class T>
struct greater
{bool operator()(const T& x, const T& y){return x > y;}
};

 1.4 题目练习

优先级队列适合来进行TOPK 以及 排序问题,因为其底层是和堆一模一样的。现在我们一起来看下面这道题:

这题如果不关心时间复杂度,直接利用 sort 排序将会很简单:

class Solution {
public:int findKthLargest(vector<int>& nums, int k) {sort(nums.begin(),nums.end());return nums[nums.size()-k];    }
};

 当我们使用优先级队列时,时间复杂度会更好:

//大堆
class Solution {
public:int findKthLargest(vector<int>& nums, int k) {priority_queue<int> pq1(nums.begin(), nums.end());for(int i = 0;i < k-1; i++){pq1.pop();}return pq1.top(); }
};
//小堆
class Solution {
public:int findKthLargest(vector<int>& nums, int k) {priority_queue<int,vector<int>, greater<int>> pq1(nums.begin(), nums.begin()+k);for(int i = k ;i < nums.size(); i++){if(nums[i] > pq1.top()){pq1.pop();pq1.push(nums[i]);}}return pq1.top(); }  
};

 2. priority_queue 模拟实现

 优先级队列的模拟实现,难点在于堆的 向上和向下调整。

2.1基本框架:

#pragma once#include <vector>namespace LHY
{//默认底层结构为 vectortemplate<class T, class Container = std::vector<T>>class priority_queue{public://构造函数及其他功能private:Container _con;	//其中的成员变量为底层容器对象};
}

2.2 默认构造函数

//默认构造函数
priority_queue():_con()
{}//迭代器区间构造
template<class InputIterator>
priority_queue(InputIterator first, InputIterator last):_con()
{while (first != last){push(*first);first++;}
}

2.3 基本函数

//判断是否为空
bool empty() const
{return _con.empty();
}//优先级队列的大小(有效元素数)
size_t size() const
{return _con.size();
}//堆顶元素(优先级最 高/低 的值)
const T& top() const
{return _con.front();
}

2.4 堆的向上以及向下调整

//向上调整
void adjust_up(size_t child)
{size_t parent = (child - 1) / 2;while (child != 0){//父 > 子 此时为大堆,如果不符合,则调整if (_con[child] > _con[parent]){std::swap(_con[child], _con[parent]);child = parent;parent = (child - 1) / 2;}elsebreak;}
}
//向下调整
void adjust_down(size_t parent)
{size_t child = parent * 2 + 1;	//假设左孩子为 【大孩子 / 小孩子】while (child < size()){//判断右孩子是否比左孩子更符合条件,如果是,则切换为与右孩子进行比较if (child + 1 < size() && _con[child + 1] > _con[child])child++;//父 > 子 此时为大堆,如果不符合,则调整if (_con[child] > _con[parent]){std::swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}elsebreak;	//满足条件时,一样需要跳出,不再调整}
}

 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/772254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【剑指offr--C/C++】JZ22 链表中倒数最后k个结点

一、题目 二、思路及代码 遍历链表并存入vector容器&#xff0c;通过下标取出对应位置元素或者返回空 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <cstddef> #include <iterator> #…

【微服务】接口幂等性常用解决方案

一、前言 在微服务开发中&#xff0c;接口幂等性问题是一个常见却容易被忽视的问题&#xff0c;同时对于微服务架构设计来讲&#xff0c;好的幂等性设计方案可以让程序更好的应对一些高并发场景下的数据一致性问题。 二、幂等性介绍 2.1 什么是幂等性 通常我们说的幂等性&…

【Entity Framework】 EF三种开发模式

【Entity Framework】 EF三种开发模式 文章目录 【Entity Framework】 EF三种开发模式一、概述二、DataBase First2.1 DataBase First简介2.2 DataBase First应用步骤2.3 DataBase First总结 三、Model First3.1 Model First简介3.2 Model First实现步骤 四、Code First4.1 Cod…

全市场都忽视了!大摩:数据中心算力成本正在迅速下降

随着AI技术迈入普及与应用的新纪元&#xff0c;其算力需求蓬勃增长的同时&#xff0c;算力成本随技术进步呈现下降趋势。 摩根士丹利在3月24日的AI报告中指出&#xff0c;随着GPU技术的不断进步&#xff0c;例如英伟达从Hopper发展到Blackwell GPU架构&#xff0c;GAI的算力成…

ChatGPT 对 ELT的理解

本文主要内容来自 ChatGPT 4.0 到底什么是 ETL&#xff1f;在数据库内部&#xff0c;把数据从 ODS 层加工成 DWD&#xff0c;再加工成 DWS&#xff0c;这个过程和 ETL 的关系是什么&#xff1f;带着这些问题&#xff0c;我问了一下 ChatGPT&#xff0c;总结如下。 数据在两个数…

AWS EC2设置root登录

在使用亚马逊的服务器时&#xff0c;官方默认是使用密钥登录&#xff0c;跟国内的云服务器差别较大&#xff0c;本文记录下&#xff0c;如何开放AWS EC2的root登录。 一、通过网页版或者XShell登录服务器 这里略过 二、设置root账户密码 # 切换 root sudo -i # 设置或修改密…

静态住宅IP VS 动态住宅IP,怎么选择?

在进行海外 IP 代理时&#xff0c;了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和&#xff0c;并提供选择建议&#xff0c;帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab) 模型描述 CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型是一种深度学习模型,结合了卷积神经网络(CNN)和双向长短期记忆网络(BiLSTM)的优点…

CBLUEbenchmark代码跑通

CBLUEbenchmark 跑通 github源地址 1.配置 数据下载 新建文件夹CLBUEDatasets,将数据放在该文件夹下模型下载到github源地址中选择一个模型来下载: 将下载好的模型放在一个专门放模型的文件夹下&#xff0c;我这里是bert 文件如下所示放置&#xff1a; 2.训练模型&#xff…

宁德时代与特斯拉合作;钟睒睒连续四次中国首富丨 RTE 开发者日报 Vol.171

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…

全自动引流,每日500+粉丝的秘诀

在如今竞争激烈的市场环境下&#xff0c;如何有效地吸引和保持精准粉丝成为了每个企业主或网红必须面对的问题。然而&#xff0c;许多人可能误以为全自动引流就意味着无人参与&#xff0c;实际上&#xff0c;它更多的是借助一些自动化工具和策略来提升我们的工作效率。今天&…

阿尔吉侬的花束 (典bfs)

0326重写&#xff0c;一个小时终于成功了 #include<algorithm> #include<iostream> #include<cstring> #include<queue>using namespace std;int t; int r,c; char mp[210][210]; bool vis[210][210]; struct node{int x,y; }; int dx[] {1,-1,0,0};…

《量子计算:揭开未来科技新篇章》

随着科技的不断发展&#xff0c;量子计算作为一项颠覆性的技术逐渐走进人们的视野&#xff0c;引发了广泛的关注和探讨。本文将围绕量子计算的技术进展、技术原理、行业应用案例、未来趋势预测以及学习路线等方向&#xff0c;深入探讨这一领域的前沿动态和未来发展趋势。 量子…

springboot swagger 接口文档分组展示

例如将 controller 分成四类&#xff0c;分别放到四个包下&#xff1a; xxx.xxx.xxx.controller.manage xxx.xxx.xxx.controller.client xxx.xxx.xxx.controller.authority xxx.xxx.xxx.controller.common SwaggerConfig.java&#xff1a; import io.swagger.annotations.Api…

【Java程序设计】【C00367】基于(JavaWeb)Springboot的粮仓管理系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…

【Python系列】获取字符串的长度

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

STL标准模板库(C++

在C里面有已经写好的标准模板库〈Standard Template Library)&#xff0c;就是我们常说的STL库&#xff0c;实现了集合、映射表、栈、队列等数据结构和排序、查找等算法。我们可以很方便地调用标准库来减少我们的代码量。 size/empty 所有的STL容器都支持这两个方法&#xff0c…

家用洗地机到底怎么选?四大宝藏品牌强推

现在洗地机已经不是什么冷门清洁家电了&#xff0c;我问过身边不少朋友&#xff0c;发现大家在选购的路上&#xff0c;大致分为两派&#xff0c;一类是按照销量和好评来判断优劣&#xff0c;另一类朋友就比较讲究了&#xff0c;会去搜索很多的相关知识&#xff0c;但在这个过程…

阅读笔记(ICIP2023)Rectangular-Output Image Stitching

“矩形输出”图像拼接 Zhou, H., Zhu, Y., Lv, X., Liu, Q., & Zhang, S. (2023, October). Rectangular-Output Image Stitching. In 2023 IEEE International Conference on Image Processing (ICIP) (pp. 2800-2804). IEEE. 0. 摘要 图像拼接的目的是将两幅视场重叠的…