c++——优先队列(priority_queue)

优先队列详解/C++
优先队列
1.概念:什么是优先队列呢?在优先队列中,元素被赋予优先级,当访问元素时,具有最高级优先级的元素先被访问 .即优先队列具有最高级先出的行为特征。它可以说是队列和排序的完美结合体,不仅可以存储数据,还可以将这些数据按照我们设定的规则进行排序。

2.定义:优先队列在头文件#include 中;其声明格式为:priority_queue ans;//声明一个名为ans的整形的优先队列

3.支持的操作:

q.empty()          //如果队列为空,则返回true,否则返回false
q.size()              //返回队列中元素的个数
q.pop()              //删除队首元素,但不返回其值
q.top()               //返回具有最高优先级的元素值,但不删除该元素
q.push(item)      //在基于优先级的适当位置插入新元素

4实例:

优先队列的时间复杂度为O(logn),n为队列中元素的个数,其存取都需要时间。

在默认的优先队列中,优先级最高的先出队默认的int类型的优先队列中先出队的为队列中较大的数

然而更多的情况下,我们是希望可以自定义其优先级的,下面介绍定义优先级的操作

priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:

priority_queue<Type, Container, Functional> 其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.STL里面默认用的是 vector.

1.比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,优先队列就是大顶堆,队头元素最大。(也就是默认非升序)
priority_queue q;

#include <iostream>
#include <queue> 
using namespace std; 
int main(){priority_queue<int> q;     for( int i= 0; i< 10; ++i ) q.push( rand() );while( !q.empty() ){cout << q.top() << endl;q.pop();}     getchar();return 0;
}

在这里插入图片描述
2.如果要用到小顶堆,则一般要把模板的三个参数都带进去。
STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆(非降序)
priority_queue<int, vector, greater > q;

#include <iostream>
#include <queue> 
using namespace std; 
int main(){priority_queue<int, vector<int>, greater<int> > q;for( int i= 0; i< 10; ++i ) q.push( rand() );while( !q.empty() ){cout << q.top() << endl;q.pop();}     getchar();return 0;
}

在这里插入图片描述
3.对于自定义类型,则必须自己重载 operator<
priority_queue q;

#include <iostream>
#include <queue> 
using namespace std; 
struct Node{int x, y;Node( int a= 0, int b= 0 ):x(a), y(b) {}
};bool operator<( Node a, Node b ){//升序 if( a.x== b.x ) return a.y> b.y;return a.x> b.x; 
}int main(){priority_queue<Node> q;     for( int i= 0; i< 10; ++i )q.push( Node( rand(), rand() ) );  //构造函数   while( !q.empty() ){cout << q.top().x << ' ' << q.top().y << endl;q.pop();}     getchar();return 0;
}

在这里插入图片描述
4.自定义cmp
priority_queue<Node, vector, cmp> q;

#include <iostream>
#include <queue> //小顶堆
using namespace std; 
struct Node{int x, y;Node( int a= 0, int b= 0 ):x(a), y(b) {}
};struct cmp{bool operator() ( Node a, Node b ){if( a.x== b.x ) return a.y> b.y;         return a.x> b.x; }
};int main(){priority_queue<Node, vector<Node>, cmp> q;     for( int i= 0; i< 10; ++i )q.push( Node( rand(), rand() ) );while( !q.empty() ){cout << q.top().x << ' ' << q.top().y << endl;q.pop();}     getchar();return 0;
}  

在这里插入图片描述

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

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

相关文章

一个div 上下两行_Django 实战 | 搭一个 GitHub 用户展示网站 02

一、创建公共 HTML 模板在 templates 文件里面新建一个 base.html&#xff0c;再到Bootstrap4中文文档找到 最基本的模板&#xff0c;拷贝代码到 base.html&#xff0c;在 home.html 中引入 base.html&#xff1a;{% extends base.html %}{% block content %}<h1>Hello W…

C#如何回到主线程,如何在委托指定线程执行

在多线程情况下&#xff0c;有时候我们需要在主线程里面执行一些逻辑&#xff0c;比如修改UI控件SynchronizationContex可以帮助我们在指定的线程执行SynchronizationContext.Current 为获取当前线程的同步上下文&#xff0c;拿到线程的上下文之后可以通过调用Send&#xff08;…

算法设计与分析——递归与分治策略——循环日程赛

问题描述&#xff1a; 非递归方案一&#xff1a;代码 #include<bits/stdc.h> using namespace std;void gameTable(vector<vector<int>> &vec,int k) {int i0,j0;//二维数组的下标&#xff0c;行&#xff0c;列 int temp;//需要新安排选手数目 int n;//…

linux开发板推荐_【新品发布】WiFi开发板XW-01-Kit,超低功耗,冷启快联,智能门锁首选!...

智能门锁作为智能家居的入口级产品以及家庭智能安防的核心单品&#xff0c;已然成为智能家居生态链中不可或缺的核心组成部分。智能门锁方案的研发仍然面临着诸多痛点&#xff0c;如耗电问题、连接繁琐和安全隐患等。物联网的应用与发展必然离不开对更低功耗的追求&#xff0c;…

如何使用 C# 扩展方法

译文链接&#xff1a;https://www.infoworld.com/article/3130492/how-to-work-with-extension-methods-in-c.htmlC# 在 3.0 版本中提供了对 扩展方法 的支持&#xff0c;扩展方法常用于给一个已存在的类添加新的方法从而扩展该类的功能&#xff0c;最关键的是&#xff1a;你不…

算法设计与分析——递归与分治策略——最接近点对问题

【问题描述】 最近对问题要求在包含有n个点的集合S中&#xff0c;找出距离最近的两个点。设 p1(x1,y1)&#xff0c;p2(x2,y2)&#xff0c;……&#xff0c;pn(xn,yn)是平面的n个点。 严格地将&#xff0c;最近点对可能不止一对&#xff0c;此例输出一对即可。 【基本算法思想…

Visual Studio 即时窗口实用技巧

在 Visual Studio 中有一个窗口叫 Immediate 窗口&#xff0c;中文版本应该叫即时窗口。默认会在你启动调试时在 VS 编辑器中弹出来。你也可以通过 Debug|Windows|Immediate 或者使用快捷键 CtrlAltI 手动把它调出来。这个窗口很实用&#xff0c;尤其是在调试的时候。下面总结几…

怎么判断再一个局域网内一个ip被两台机器占用_交换机与 VLAN 到底是怎么来的...

最近有几个学生粉丝后台私信我&#xff0c;让我说说交换机与 VLAN。我在阅读这几个粉丝私信中发现一个有趣的现象&#xff0c;那就是吐槽大学计算机网络课程的晦涩枯燥&#xff0c;而不是去深层次解释协议出现的原因或者用来去解决什么问题。帅天今天就和大家聊聊交换机与 VLAN…

移动建模平台元数据存储架构演进

源宝导读&#xff1a;明源云天际-移动建模平台是一个快速生成多端移动应用的PaaS平台&#xff0c;元数据是移动应用设计与运行的核心数据结构&#xff0c;本文将从元数据存储这个视角分享我们的技术思考与实践。一、什么是元数据&#xff08;Metadata&#xff09;&#xff1f;这…

浅谈AsyncLocal,我们应该知道的那些事儿

【导读】最近查看有关框架源码&#xff0c;发现AsyncLocal这玩意水还挺深&#xff0c;于是花了一点功夫去研究&#xff0c;同时对比ThreadLocal说明二者区别以及在何时场景下使用AsyncLocal或ThreadLocalThreadLocal相信很多童鞋用过&#xff0c;但AsyncLocal具体使用包括我在内…

算法设计与分析——动态规划——数字三角形问题

数字三角形问题 1.题目描述&#xff1a;给定一个由n行数字组成的数字三角形&#xff0c;如图3-7所示。设计一个算法&#xff0c;计算出从三角形的顶至底的一条路径&#xff0c;使该路径经过的数字总和最大。 算法设计:对于给定的由n行数字组成的数字三角形&#xff0c;计算从三…

如何在 Asp.Net Core MVC 中处理 null 值

译文链接&#xff1a;https://www.infoworld.com/article/3434624/how-to-handle-null-values-in-aspnet-core-mvc.html传统的 asp.net mvc 对应着 .netcore 中的 asp.net core mvc&#xff0c;可以利用 asp.net core mvc 去构建跨平台&#xff0c;可扩展&#xff0c;高性能的w…

算法设计与分析——动态规划——最长公共子序列

#include<iostream> #include<stdio.h> #include<string.h> #include<bits/stdc.h> #define MAXLEN 50 using namespace std;void LCSlength(int m,int n,char *x,char *y,int c[][MAXLEN],int b[][MAXLEN]) {for(int i0;i<m;i)//m为字符个数 {c[i]…

程序员过关斩将--论系统设计的高可扩展性

“此文仅仅代表个人意见&#xff0c;并非行业标准“MQ是万能的高扩展方式&#xff1f;“面向接口是万能的高扩展方式&#xff1f;说到系统设计的三高&#xff0c;每一高都是一个很庞大的话题&#xff0c;甚至可以用一本书甚至N本书来详细阐述。其中高可扩展性是系统架构的众多目…

Docker Vs Podman

翻译自 Chetansingh 2020年4月24日的博文《Docker Vs Podman》 [1]容器化的一场全新革命是从 Docker 开始的&#xff0c;Docker 的守护进程管理着所有的事情&#xff0c;并成为最受欢迎和广泛使用的容器管理系统之一。但是&#xff0c;请稍等&#xff01;您真的会假设 Docker 是…

算法设计与分析——动态规划——01背包问题

#include<iostream> #include<iomanip> using namespace std; //前i个物品装入容量为j的背包中获得的最大价值//0-1背包动态规划算法 构造二维表 int knapsack_problem( int n,int *weight,int *value,int capacity,int **m,int *flag) {for(int i0;i<capaci…

让 CefSharp.WinForms 应用程序同时支持32位(x86)和64位(x64)的解决方案

当我们为基于 .NET Framework 的 WinForm 程序增加 CefSharp.WinForms 依赖后&#xff0c;可能会遇到以下报错信息&#xff1a;CefSharp.Common is unable to proceeed as your current Platform is ‘AnyCPU’. To target AnyCPU please read https://github.com/cefsharp/Cef…

算法设计与分析——贪心算法——活动安排问题

问题描述&#xff1a;设有n个活动的集合E{1,2,…,n}&#xff0c;其中每个活动都要求使用同一资源&#xff0c;如演讲会场等&#xff0c;而在同一时间内只有一个活动能使用这一资源。 每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si<fi 。 如果选择了活动…

c语言——刷新控制台界面与返回上一级

#include<iostream> #include<stdlib.h> using namespace std;int main() {while(1){system("cls");//刷新控制台程序界面 cout<<"请输入1&#xff1a;进入下一级程序A:"<<endl;cout<<"请输入2&#xff1a;进入下一级程…

C# :异步编程的注意点

在上一篇《C#&#xff1a;异步编程中的 async 和 await》 中简单介绍了在 C# 中的异步编程以及 async 和 await 编程模型&#xff0c;本文介绍下异步编程的注意事项&#xff0c;主要有以下几个方面。同步中调用异步在同步代码中调用异步代码&#xff0c;容易导致死锁&#xff0…