优先队列c++ STL用法

优先队列(priority queue)
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。

优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序

每次的push和pop操作,队列都会动态的调整,以达到我们预期的方式来存储。

例如:我们常用的操作就是对数据排序,优先队列默认的是数据大的优先级高

所以我们无论按照什么顺序push一堆数,最终在队列里总是top出最大的元素。

 优先队列的常用操作

优先级队列支持的操作

q.empty()         如果队列为空,则返回true,否则返回false

q.size()            返回队列中元素的个数

q.pop()             删除队首元素,但不返回其值

q.top()             返回具有最高优先级的元素值,但不删除该元素

q.push(item)     在基于优先级的适当位置插入新元素



用法:

示例:将元素5,3,2,4,6依次push到优先队列中,print其输出。

1. 标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。

priority_queue<int> pq;

通过<操作符可知在整数中元素大的优先级高。
故示例1中输出结果为: 6 5 4 3 2

 

2. 数据越小,优先级越高

priority_queue<int, vector<int>, greater<int> >pq; 

其中
第二个参数为容器类型。
第二个参数为比较函数。
故示例2中输出结果为:2 3 4 5 6

3. 自定义优先级,重载比较符号

重载默认的 < 符号

struct node
{friend bool operator< (node n1, node n2){return n1.priority < n2.priority;}int priority;int value;
}; 

这时,需要为每个元素自定义一个优先级。

注:重载>号会编译出错,因为标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。
而且自定义类型的<操作符与>操作符并无直接联系

#include<iostream>
#include<functional>
#include<queue>
using Namespace stdnamespace std;
struct node
{friend bool operator< (node n1, node n2){return n1.priority < n2.priority;}int priority;int value;
};
int main()
{const int len = 5;int i;int a[len] = {3,5,9,6,2};//示例1priority_queue<int> qi;for(i = 0; i < len; i++)qi.push(a[i]);for(i = 0; i < len; i++){cout<<qi.top()<<" ";qi.pop();}cout<<endl;//示例2priority_queue<int, vector<int>, greater<int> >qi2;for(i = 0; i < len; i++)qi2.push(a[i]);for(i = 0; i < len; i++){cout<<qi2.top()<<" ";qi2.pop();}cout<<endl;//示例3priority_queue<node> qn;node b[len];b[0].priority = 6; b[0].value = 1; b[1].priority = 9; b[1].value = 5; b[2].priority = 2; b[2].value = 3; b[3].priority = 8; b[3].value = 2; b[4].priority = 1; b[4].value = 4; for(i = 0; i < len; i++)qn.push(b[i]);cout<<"优先级"<<'\t'<<"值"<<endl;for(i = 0; i < len; i++){cout<<qn.top().priority<<'\t'<<qn.top().value<<endl;qn.pop();}return 0;
}

先级队列可以用向量(vector)或双向队列(deque)来实现(注意list container 不能用来实现queue,因为list 的迭代器不是任意存取iterator,而pop 中用到堆排序时是要求randomaccess iterator 的!):
priority_queue<vector<int>, less<int>> pq1; // 使用递增less<int>函数对象排序
priority_queue<deque<int>, greater<int>> pq2; // 使用递减greater<int>函数对象排序
其成员函数有“判空(empty)” 、“尺寸(Size)” 、“栈顶元素(top)” 、“压栈(push)” 、“弹栈(pop)”等。

例:
 1 #include <iostream>
 2 #include <queue> 
 3 using namespace std;
 4  
 5 class T {
 6 public:
 7     int x, y, z; 
 8     T(int a, int b, int c):x(a), y(b), z(c)
 9     { 
10     }
11 };
12 bool operator < (const T &t1, const T &t2) 
13 {
14     return t1.z < t2.z; // 按照z的顺序来决定t1和t2的顺序
15 
16 main()
17 
18     priority_queue<T> q; 
19     q.push(T(4,4,3)); 
20     q.push(T(2,2,5)); 
21     q.push(T(1,5,4)); 
22     q.push(T(3,3,6)); 
23     while (!q.empty()) 
24     { 
25         T t = q.top(); 
26         q.pop(); 
27         cout << t.x << " " << t.y << " " << t.z << endl; 
28     } 
29     return 1
30 }
      输出结果为(注意是按照z的顺序从大到小出队的): 
      3 3 6 
      2 2 5 
      1 5 4 
      4 4 3

      再看一个按照z的顺序从小到大出队的例子:
 1 #include <iostream> 
 2 #include <queue> 
 3 using namespace std; 
 4 class T 
 5 
 6 public
 7     int x, y, z; 
 8     T(int a, int b, int c):x(a), y(b), z(c) 
 9     {
10     } 
11 }; 
12 bool operator > (const T &t1, const T &t2) 
13 
14     return t1.z > t2.z; 
15 
16 main() 
17 
18     priority_queue<T, vector<T>, greater<T> > q; 
19     q.push(T(4,4,3)); 
20     q.push(T(2,2,5)); 
21     q.push(T(1,5,4)); 
22     q.push(T(3,3,6)); 
23     while (!q.empty()) 
24     { 
25         T t = q.top(); 
26         q.pop(); 
27         cout << t.x << " " << t.y << " " << t.z <<  endl; 
28     } 
29     return 1
30 }
      输出结果为: 
      4 4 3 
      1 5 4 
      2 2 5 
      3 3 6
      如果我们把第一个例子中的比较运算符重载为: bool operator < (const T &t1, const T &t2) { return t1.z > t2.z; // 按照z的顺序来决定t1和t2的顺序} 则第一个例子的程序会得到和第二个例子的程序相同的输出结果。

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

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

相关文章

window 远程linux

1.我们需要在Linux安装ssh服务 sudo apt-get install openssh-server 2.然后开启ssh服务 sudo /etc/init.d/ssh start 3.在window上安装PUTTY 下载网址 4.填写Linux ip 查看ip: 在Linux输入&#xff1a;ifconfig 5.然后填写登陆Linux的账户名和密码 大功告成。。。。。…

赫夫曼编码长度计算问题?

例题&#xff1a;一组字符(a,b,c,d)在文中出现的次数分别为(7,6,3,5),字符&#xff07;d&#xff07;的哈夫曼编码的长度为&#xff1f; 题解&#xff1a; 首先构造huffman树 每一步都将所有数字排序 方法如下: 1: 3 5 6 7 2: 6 7 8 / \ 3 5 3: 8 13 / \ / \ 3 5 6 7 4: 21 /…

windows + cmake + vs2019 编程

1.安装minGW64 2.安装cmake 3.安装vs2019 4.组建代码文件结构&#xff1a; 5.在build 文件下打开git bash&#xff0c;执行一下指令 cmake .. -G"Visual Studio 16 2019" tips( vs2017 对应 cmake .. -G"Visual Studio 15 2017" ) cmake 模板…

sdut 数据结构实验之二叉树六:哈夫曼编码

#include <iostream> #include <cstdio> #include <cstring> #include <queue>using namespace std;int main() {char s[10000];while(scanf("%s",s)!EOF){priority_queue < int,vector<int>,greater<int> > Q;//利用优先…

Eigen基本操作

// 矩阵 Eigen::Matrix<float,行,列> // Eigen 中所有向量和矩阵都是Eigen::Matrix&#xff0c;它是一个模板类。它的前三个参数为&#xff1a;数据类型&#xff0c;行&#xff0c;列// 声明一个2*3的float矩阵Eigen::Matrix<float, 2, 3> matrix_23;//float类型…

所感

记住别太善良了&#xff0c;别太大方了&#xff0c;也别太能干了&#xff0c;时间久了人家会觉得&#xff0c;你做的一切都是应该的。即使有一天你撑不住&#xff0c;哭了累了&#xff0c;也没人心疼你。 因为在他们眼里这都是你愿意的。有时候心眼也别太好了不要什么事都为别人…

PCL库使用中遇到的一些问题及解决方法

a. pcl::PointCloud对象变量 与pcl::PointCloud::Ptr 对象指针 的相互转换 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/point_cloud.h> // 对象指针 pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPointer(new pcl:…

享受孤独

今天看见网易云音乐一个 有趣的活动。。。突发其感参与了评论“孤独”这个话题&#xff1a;

opencv 图像访问索引

//单通道获取 Scalar intensity img.at<uchar>(y, x);//行 列 Scalar intensity img.at<uchar>(Point(x, y)); 0 < intensity.val[0] < 255. // 多通道获取 8u Vec3b intensity img.at<Vec3b>(y, x); uchar blue intensity.val[0]…

使自己的注意力集中方法

英国Kent大学最近有一篇文章对注意力做出了详尽的分析&#xff0c;关于如何保持专心养成好习惯的&#xff0c;其中包括了如下几点建议&#xff1a; 养成好习惯&#xff1a;养成在固定时间、固定地点专心学习工作的好习惯。如果可能&#xff0c;在进入学习或者工作状态前做一些小…

PCL “(”:“::”右边的非法标记 和 E2512 功能测试宏的参数必须是简单标识符

PCL “(”:“::”右边的非法标记 解决方法&#xff1a; 项目属性 ——> C/C ——> 预处理器 ——> 预处理器定义 (此处添加预定义编译开关 NOMINMAX&#xff09; E2512 功能测试宏的参数必须是简单标识符 解决方法&#xff1a; 将SDL 设置为否。

最全ACM常用STL

STL 中专门用于排列的函数&#xff08;可以处理存在重复数据集的排列问题&#xff09; 头文件&#xff1a;#include <algorithm> using namespace std; 调用&#xff1a; next_permutation(start, end); 注意&#xff1a;函数要求输入的是一个升序排列的序列的头指针和尾…

ubuntu 安装cmake

方法一&#xff1a; sudo apt-get install cmake 跟新中。。。。。。。。。

普通本科生应该坚持ACM吗?知乎

这是本人当初学ACM有疑惑从知乎看见这一篇文章&#xff0c;从中解决了自己的疑惑&#xff0c;虽然是粘贴复制&#xff0c;但是我觉得我们可以从里面找出自己想要的答案&#xff01; 非211一本学校&#xff0c;软件工程专业。学校搞ACM的水平不高&#xff0c;最好的大概就是区域…

邻接表存储图利用BFS遍历

//今天上机写的邻接表存储图利用BFS遍历&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> using namespace std; struct node//存节点所连接的点 {int id;node *next; }; struct list//存各个节点的顶点值 {…

windows 安装tensorflow2.0

预先装好python 然后在命令行输入&#xff1a; gpu版本&#xff1a; 需要预先装好&#xff1a;cuda 和cudnn 才能使用。 pip install numpy pandas matplotlib sklearn tensorflow-GPU2.0.0-alpha0 -i https://pypi.doubanio.com/simple cpu 版本&#xff1a; alpha0 &…

解决虚拟机打开不了?提示VMware Workstation cannot connect to the virtual machine的问题

解决方法&#xff1a; 从提示消息我们可以看到&#xff0c;问题在于VMware授权服务没有开启&#xff0c;具体处理方法如下&#xff1a; No1. "This PC&#xff08;我的电脑&#xff09;"---右键"manage&#xff08;管理&#xff09;"---"Service and…

双目立体匹配算法

Loopy belief propagation, Markov Random Field, stereo vision website&#xff1a;http://nghiaho.com/?page_id1366

Redis-3.2.4服务搭建

1.下载安装包并解压 全部版本地址&#xff1a;http://download.redis.io/releases 安装包下载&#xff1a; http://download.redis.io/releases/redis-3.2.4.tar.gz 我们这里使用3.2.4 2.编译安装 cd redis-3.2.4 make && make install 可能异常&#xff1a;&…