【C++/STL】:优先级队列的使用及底层剖析仿函数

目录

  • 💡前言
  • 一,优先级队列的使用
  • 二,仿函数
    • 1,什么是仿函数
    • 2,仿函数的简单示例
  • 三,优先级队列的底层剖析

💡前言

优先队列(priority_queue)是一种容器适配器,默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意:默认情况下priority_queue是大堆

注意:使用优先级队列要包含头文件 < queue >

一,优先级队列的使用

在这里插入图片描述

代码实现如下:

这里的建堆一般有两种方式:
(1) 一种是一个一个push进vector容器再进行向上调整建堆
(2) 另一种是直接用迭代器区间构造直接建堆(推荐用这种)

#include <iostream>
#include <queue>
#include <functional>
using namespace std;void test_priority_queue()
{vector<int> v = { 6,0,3,5,4,7,9,1,2,8 };//默认升序//priority_queue<int> pq(v.begin(), v.end());//一个一个尾插建堆priority_queue<int, vector<int>, greater<int>> pq;for (auto e : v){pq.push(e);}//迭代器区间构造,直接建堆//priority_queue<int,vector<int>,greater<int>> pq(v.begin(), v.end());while (!pq.empty()){cout << pq.top() << " ";pq.pop();}cout << endl;}int main()
{test_priority_queue();return 0;
}

注意:优先级队列默认的大堆,降序排列,如果要升序,就要换仿函数。下图中第三个模板参数就是传仿函数。

使用算法库里的 less 和 greater 算法,需要包含头文件< functional >

在这里插入图片描述

二,仿函数

1,什么是仿函数

仿函数也叫函数对象,是一个重载了 operator() 的类,可以使得类的对象像函数一样使用

2,仿函数的简单示例

operator()并没有参数的个数和返回值,所以使用是十分灵活的

struct Func1
{//无参无返回值void operator()(){cout << "Func调用" << endl;}
};struct Func2
{//有参无返回值void operator()(int n){while (n--){cout << "Func调用" << endl;}}
};int main()
{Func1 f1;f1();  //使得对象像函数一样使用f1.operator()(); //显示调用cout << endl;Func2 f2;f2(3);  //使得对象像函数一样使用return 0;
}

在这里插入图片描述

三,优先级队列的底层剖析

namespace ling
{template<class T>class myless{public:bool operator()(const T& x, const T& y){return x < y;}};template<class T>class mygreater{public:bool operator()(const T& x, const T& y){return x > y;}};template <class T, class Container = vector<T>, class Compare = myless<T>>class priority_queue{public:priority_queue() = default;//迭代器区间构造template <class InputIterator>priority_queue(InputIterator first, InputIterator last){while (first != last){con.push_back(*first);++first;}//建堆for (int i = (con.size() - 1 - 1) / 2; i >= 0; i--){Adjust_down(i);}}bool empty() const{return con.empty();}size_t size() const{return con.size();}// 堆顶元素不允许修改,因为:堆顶元素修改可以会破坏堆的特性const T& top()const{return con[0];}//向上调整void Adjust_up(int child){int parent = (child - 1) / 2;while (child > 0){//if (con[parent] < con[child])if(comp(con[parent], con[child])){swap(con[parent], con[child]);child = parent;parent = (child - 1) / 2;}else{break;}}}void push(const T& x){con.push_back(x);Adjust_up(con.size() - 1);}//向下调整void Adjust_down(int parent){int child = parent * 2 + 1;while (child < con.size()){if (child + 1 < con.size() && comp(con[child], con[child + 1])){child += 1;}//if (con[parent] < con[child])if(comp(con[parent], con[child])){swap(con[parent], con[child]);parent = child;child = parent * 2 + 1;}else{break;}}}void pop(){swap(con[0], con[con.size() - 1]);con.pop_back();Adjust_down(0);}private:Container con;Compare comp;};
}

测试代码

void TestQueuePriority()
{ling::priority_queue<int> q1;q1.push(5);q1.push(1);q1.push(4);q1.push(2);q1.push(3);q1.push(6);cout << q1.top() << endl;q1.pop();q1.pop();cout << q1.top() << endl;vector<int> v{ 5,1,4,2,3,6 };ling::priority_queue<int, vector<int>, ling::greater<int>> q2(v.begin(), v.end());cout << q2.top() << endl;q2.pop();q2.pop();cout << q2.top() << endl;
}

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

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

相关文章

Pbootcms留言“提交成功”的提示语怎么修改

我们在用到pbootcms建站时候&#xff0c;其中有个留言功能&#xff0c;提交成功后会提示&#xff1a;提交成功&#xff08;如下图所示&#xff09;&#xff0c;那么我们要修改这个提示语要怎么操作呢&#xff1f; 如果需要修改的话&#xff0c;直接找到文件/apps/home/control…

【Android】【Compose】Compose里面的Row和Column的简单使用

内容 Row和Column的简单使用方式和常用属性含义 Row 在 Jetpack Compose 中&#xff0c;Row 是一种用于在水平方向排列子元素的布局组件。它类似于传统 Android 中的 LinearLayout&#xff0c;但更加灵活和强大。 Row的代码 Composable inline fun Row(modifier: Modifier…

最新扣子(Coze)实战案例:图像流工具之空间风格化,完全免费教程

&#x1f9d9;‍♂️ 大家好&#xff0c;我是斜杠君&#xff0c;手把手教你搭建扣子AI应用。 &#x1f4dc; 本教程是《AI应用开发系列教程之扣子(Coze)实战教程》&#xff0c;完全免费学习。 &#x1f440; 关注斜杠君&#xff0c;可获取完整版教程。&#x1f44d;&#x1f3f…

Python的Django部署uwsgi后自签名实现的HTTPS

通过SSL/TLS来加密和客户端的通信内容。提高网络安全性&#xff0c;但是会损耗部分的服务器资源。 HTTPS 的原理图。 web.key 是打死也不能给其他人的。一定要保存好。里面主要是私钥。是各种认证的根基。本地测试的话生成1024的即可&#xff0c;如果是生产环境推荐使用2048。…

高级运维工程师讲述银河麒麟V10SP1服务器加固收回权限/tmp命令引起生产mysql数据库事故实战

高级运维工程师讲述银河麒麟V10SP1服务器加固收回权限/tmp命令引起生产MySql数据库事故实战 一、前言 作为运维工程师经常会对生产服务器进行安全漏洞加固&#xff0c;一般服务厂商、或者甲方信息安全中心提供一些安全的shell脚本&#xff0c;一般这种shell脚本都是收回权限&…

查看当前服务器Kafka是否已启动

# 查看当前系统中的java进程 # -ml 详细内容 jps -ml | grep Kafka

《人人都是产品经理》:项目坎坷的一生(下)

《人人都是产品经理》&#xff1a;项目坎坷的一生&#xff08;下&#xff09; 文档只是手段模板的作用多人协作与版本管理 流程只不过是手段这么多评审&#xff0c;可以省嘛&#xff1f; 敏捷更是手段有计划、更拥抱变化迭代周期内尽量不增加任务 集中工作、小步快跑持续细化需…

开放式耳机哪个牌子好?2024热门红榜开放式耳机测评真实篇!

当你跟朋友们聊天时&#xff0c;他们经常抱怨说长时间戴耳机会令耳朵感到不适,后台也有很多人来滴滴我&#xff0c;作为一位致力于开放式耳机的测评博主&#xff0c;在对比了多款开放式耳机之后&#xff0c;你开放式耳机在保护听力方面确实有用。开放式的设计有助于减轻耳道内的…

【EXCEL技巧】Excel如何将数字前面的0去掉

Excel文件中经常会遇到数据是0001345这种&#xff0c;那么&#xff0c;如何将数字前面的0去掉呢&#xff1f;今天和大家分享方法。 首先&#xff0c;选中一列空的单元格&#xff0c;然后在单元格中输入公式TEXT(D3,0)&#xff0c;这里的D3指的是前面带有0的数据的位置 回车之后…

DAMA学习笔记(三)-数据架构

1.引言 架构是构建一个系统&#xff08;如可居住型建筑&#xff09;的艺术和科学&#xff0c;以及在此过程中形成的成果——系统本身。用通俗的话说&#xff0c;架构是对组件要素有组织的设计&#xff0c;旨在优化整个结构或系统的功能、性能、可行性、成本和用户体验。 对于架…

如何在SOLIDWORKS中高效管理文件属性?

当我们完成零件设计&#xff0c;出工程图后&#xff0c;发现零件中部分属性值需修改&#xff0c;或漏掉一些属性值需要添加&#xff0c;也可能老旧的设计图纸需要统一规范。 这时我们用SOLIDWORKS自带的属性标签工具就可以快速完成文件的属性编辑。 1打开工程图纸&#xff0c;…

生鲜水果行业wordpress主题

水果蔬菜wordpress外贸自建站模板 水果、脐橙、牛油果、菠萝、凤梨、鲜枣、苹果、芒果、瓜果、百香果wordpress外贸独立站模板。 https://www.jianzhanpress.com/?p3932 生鲜wordpress外贸出口网站模板 水果、蔬菜、肉蛋奶、水产、干货等生鲜产品wordpress外贸出口公司网站…

Postman 怎么测接口?实用教程

在当前&#xff0c;API&#xff08;应用程序接口&#xff09;的使用变得越来越普遍。其中&#xff0c;HTTP/HTTPS API 是最常见的一种。无论是开发前端还是后端&#xff0c;测试 API 都是一个关键环节。Postman 是一种流行且强大的 API 测试工具&#xff0c;能够帮助开发人员轻…

好用的兼容性测试工具推荐

兼容性测试确保软件在不同系统和环境中的一致性。本指南探讨了开发人员和QA专业人员有效检测和解决问题的工具&#xff0c;从而提高应用程序的稳健性和用户满意度。 好用的兼容性测试工具推荐 1.Lambda测试 它是一个由AI驱动的测试编排和执行平台&#xff0c;可让您使用超过300…

多端圈子校园论坛系统源码搭建教程,新手轻松搭建!

圈子社交系统以用户为中心&#xff0c;提供直观易用的界面和流程。用户可轻松注册、浏览内容、加入或创建圈子&#xff0c;并与其他用户互动。系统强化兴趣圈子功能&#xff0c;智能推荐相关圈子。同时确保隐私和安全&#xff0c;采用先进的安全措施保护用户数据。系统需持续优…

linux rocky9.2系统搭建sqle数据库审核平台

文章目录 前言一、环境准备?二、开始部署前言 关于SQLE SQLE 是由上海爱可生信息技术股份有限公司 开发并开源,支持SQL审核、索引优化、事前审核、事后审核、支持标准化上线流程、原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。 产品特色 支持通过插件的形式扩展…

基于大数据架构的内容安全风控与分析

1 项目介绍 1.1 研究目的和意义 在数字化时代&#xff0c;内容安全成为了互联网企业面临的一个重要挑战。海量数据的产生与传播&#xff0c;伴随着不良信息和网络安全威胁的日益增加。因此&#xff0c;本课题旨在通过构建一个基于大数据架构的内容安全风控与分析系统&#xf…

早期结直肠癌筛查需重视,华大基因肿瘤检测助力精准医学发展

当前&#xff0c;结直肠癌已跃居中国肿瘤发病率的第二位&#xff0c;且多数患者在发现时已是晚期&#xff0c;其生存率相对较低。据国家癌症中心最新数据的揭示&#xff0c;2022年新增的结直肠癌病例数量高达51.71万&#xff0c;其中&#xff0c;死亡人数则达到了24万。值得注意…

基于MindSpore Quantum的Grover搜索算法和龙算法

如果你听过量子计算&#xff0c;那么你一定听说过Grover搜索算法。1996年&#xff0c;Lov Grover [1] 提出了Grover搜索算法&#xff0c;它是一种利用量子状态的叠加性进行并行计算并实现加速的算法。Grover搜索算法被公认为是继Shor算法后的第二大量子算法&#xff0c;也是第一…

解码数智升级良方:中国一拖、中原传媒、神火股份等企业数字化实践分析

大模型、AI等技术的成熟以及政策法规的细化&#xff0c;数据资源的权属论证、合规确权、资产论证等环节逐渐走向实用性、价值化。 而伴随着“业财税数融”综合性数字化成为企业数字化转型的主流选择&#xff0c;财务部门的纽带属性被放大&#xff0c;财务数据的融合能力成为企业…