[C++STL教程]7.priority_queue优先队列入门学习!零基础都能听懂的教程
不知不觉C++STL教程系列已经第7期了。之前我们介绍过:vector, queue, stack, set, map等等数据结构。
今天我们来学习一个新的stl容器:priority_queue优先队列。
作者:Eriktse
简介:19岁,211计算机在读,现役ACM银牌选手力争以通俗易懂的方式讲解算法!️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)
个人博客:www.eriktse.com
priority_queue介绍
priority_queue是STL中的一个重要容器,它类似于普通的队列,支持弹出堆顶元素和插入元素的操作,但是有一个很大的不同:队列中元素按照优先级参数排序,最小(或者最大)元素总是在队列的前端,并且会在每次出队的时候被删除。
priority_queue拥有两种不同的方式:一种是按照大顶堆(max heap)方式排序,另一种是按照小顶堆(min heap)方式排序。STL提供了基于容器改编的priority_queue,因此可以在传递给priority_queue的容器中,支持不同类型的元素。
初始化
在使用priority_queue之前需要引入头文件#include <priority_queue>。
用以下代码初始化一个空的priority_queue。
priority_queue<int> pq;//默认为大根堆
priority_queue<int, vector<int>, greater<int> > pq2;//修改为小根堆
可以用适当类型的对象初始化一个优先级队列:
string wrds[] { "one", "two", "three", "four"};
priority_queue<string> words {start(wrds), end(wrds)}; // "two" "three" "one" "four"
如果是存放结构体,且要自定义比较函数,可以用仿函数,就是用写一个结构体,然后重载()运算符。
struct Node
{
int a, b;
};//声明Node结构体
struct cmp
{
bool operator () (const Node &u, const Node &v)const
{
return u.a < v.a;
}
};
priority_queue<Node, vector<Node>, cmp> pq_Node;
常用操作函数
priority_queue仅维护一个顶部。
插入元素
push()方法:用于将一个新元素添加到堆中。
pq1.push(1);//将元素1插入到pq1中。
获取堆顶元素
top()方法:获取堆顶的元素,但是不会自动弹出,如果需要弹出请再加一个pop()。
注意当堆为空时,不允许获取堆顶元素,或弹出堆顶元素,需要判断堆非空才能对堆顶操作。
获取堆内元素个数
size()方法:返回一个非负整数,表示堆内元素个数。
当size() == 0时,表示堆为空。
判断堆是否为空
empty()方法:返回一个bool值,表示堆是否为空。
cout << pq.empty() << '\n';//true
pq.push(1);
cout << pq.empty() << '\n';//false
弹出元素
pop()方法:函数用于从堆中弹出当前最大值,并删除该元素。
pq.pop();//将pq中的堆顶元素弹出。
举个例子
#include <iostream>
#include<queue>
using namespace std;
int main()
{
// 以下是字符常量
priority_queue <char> pq;
pq.push('C');
pq.push('Q');
pq.push('T');
pq.push('A');
// 打印队列
cout << "队列中的元素为:" << endl;
while (!pq.empty())
{
cout << pq.top() << " ";
pq.pop();//弹出
}
cout << endl;
// 整型变量
priority_queue <int> pq1;
pq1.push(30);
pq1.push(100);
pq1.push(25);
pq1.push(15);
// 打印队列
cout << "队列中的元素为:" << endl;
while (!pq1.empty()) {
cout << pq1.top() << " ";
pq1.pop();
}
cout << endl;
// 浮点常量
priority_queue <float> pq2;
pq2.push(2.5);
pq2.push(1.6);
pq2.push(103.5);
pq2.push(17.1);
// 打印队列
cout << "队列中的元素为:" << endl;
while (!pq2.empty()) {
cout << pq2.top() << " ";
pq2.pop();
}
cout << endl;
return 0;
}
总结
priority_queue的常用操作方法总结:
1、push()方法:向优先队列中插入元素,插入的元素的优先级由其权值决定。
2、pop()方法:从优先队列中弹出最小的元素,将其从队列中删除。
3、top()方法:获取队列中最小的元素,不会将其从队列中删除。
4、empty()方法:判断队列是否为空,为空返回true,不为空返回false。
5、size()方法:获取队列中元素的个数。
总的来说,priority_queue是一种非常有用的容器,它支持不同类型元素的存储和优先级高低排序,对于简单的任务操作,配合几个函数即可实现,而且还可以自定义比较函数改变默认的排序方式。
[C++STL教程]7.priority_queue优先队列入门学习!零基础都能听懂的教程的更多相关文章
- vue入门学习(基础篇)
vue入门学习总结: vue的一个组件包括三部分:template.style.script. vue的数据在data中定义使用. 数据渲染指令:v-text.v-html.{{}}. 隐藏未编译的标 ...
- [STL] queue 队列 priority_queue 优先队列
- Python学习零基础<入门必学>
1. 注释注释 是任何存在于 # 号右侧的文字,其主要用作写给程序读者看的笔记. 2. 字面常量一个字面常量(Literal Constants)的例子是诸如 5.1.23 这样的数字,或者是如 这是 ...
- 09-Python入门学习-函数基础与参数
一.函数基础 1.定义函数的三种形式 1.1 无参函数 def foo(): print('from foo') foo() 1.2 有参函数 def bar(x,y): print(x,y) bar ...
- 03-Python入门学习-Python基础
一.与用户交互 1.什么是与用户交互 程序等待用户输入一些数据,然后程序执行完毕后为用户反馈信息 2.为何程序要与用户交互 为了让计算机能够像人一样与用户的交互 3.如何用 在python3中:inp ...
- 🚴♂️全套MySQL数据库教程_Mysql基础入门教程,零基础小白自学MySQL数据库必备教程☔ #002 # 第二单元 MySQL数据类型、操作表#
二.本单元知识点概述 (Ⅰ)知识点概述 二.本单元教学目标 (Ⅰ)重点知识目标 1.Mysql的数据类型2.如何选择数据类型3.创建表4.修改表5.删除表 (Ⅱ)能力目标 1.熟练创建数据库及删除数据 ...
- CTF入门学习2->Web基础了解
Web安全基础 00 Web介绍 00-00 Web本意是网,这里多指万维网(World Wide Web),是由许多互相连接的超文本系统组成的,通过互联网访问. Web是非常广泛的互联网应用,每天都 ...
- 谁都能听懂的Redux+Redux-Saga超级傻瓜教程
对不起本文确实有标题党的嫌疑:) 想要理解本文还是要先会用react和es6,如果连react和es6都不知道是什么的话我也没辙:( 如果你选择用react来开发应用,并且你没对各个组件的状态进行应有 ...
- 条件期望:Conditional Expectation 举例详解之入门之入门之草履虫都说听懂了
我知道有很多人理解不了 "条件期望" (Conditional Expectation) 这个东西,有的时候没看清把随机变量看成事件,把 \(\sigma\)-algebra 看成 ...
- PHP 入门学习教程及进阶(源于知乎网友的智慧)
思过崖历程: 自学的动机.自学的技巧.自学的目标三个方面描述学习PHP的经历 一.自学的动机: 一定要有浓厚的兴趣,兴趣是最后的老师,可以在你迷茫的时候不断地支撑着你走下去. 自学不是为了工作,不是为 ...
随机推荐
- 在Unity3D中开发的Toon Shader
SwordMaster Toon Shader 特点 此卡通渲染风格的Shader是顶点片元Shader,由本人手动编写完成 此卡通渲染风格的Shader已经在移动设备真机上进行过测试,可以直接应用到 ...
- 移动APP测试要点
一. UI测试 (1) 页面布局 ① 页面布局合理且友好,符合用户习惯 ② 列表型界面有滚动条 ③ 功能入口明显,容易找到 (2) 图形测试 ① 图片大小合适且清晰 ② 页面字体与风格一致 ③ 背景颜 ...
- openEuler22.09初始化脚本
#!/bin/bash s=`nmcli d | grep "已断开" | awk '{print $1}'` echo /etc/sysconfig/network-script ...
- ORA-00972: identifier is too long异常处理
环境:由于数据库更换,做数据同步,提示 too long 问题,导致一直无法同步完数据. 经排查 oracle 历史数据库版本: Oracle Database 12c Standard Editio ...
- python音乐分类--knn
1 #利用knn算法分类音乐,将音乐进行情绪分类 2 #将音乐分为兴奋的(excited), 愤怒的(angry),悲伤的(sorrowful),轻松的(relaxed) 3 4 #可分离因素 5 # ...
- systick 理解
systick 中断的优先级往往设置为最低值,而不是最高值:如果设置为最低值不会发生上图标号[6]处的情况,设置为最低可能会被其他中断抢占,延长systick的响应时间,但是这个延迟不会累计,因为sy ...
- 学习Java的第一个代码
HelloWorld 新建一个文件夹 新建一个Java 文件后缀为java hello.java 编写代码 public class hello{ public static void main(St ...
- 第12组 Beta冲刺 (3/5)
1.1基本情况 ·队名:美少女战士 ·组长博客:https://www.cnblogs.com/yaningscnblogs/p/14016611.html ·作业博客:https://edu.cnb ...
- GDB 调试 - 正确地加载调试符号文件
一.开发流程 1. 编译可执行文件 1 #include <stdio.h> 2 #include <unistd.h> 3 4 void test() 5 { 6 char ...
- NOIP2008普及组
T2]排座椅 横行相同时列数+1,纵行相同时行数+1. 主要是用桶排序,因为范围太大了,用sort会超时 #include<iostream> #include<cstring> ...