不知不觉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优先队列入门学习!零基础都能听懂的教程的更多相关文章

  1. vue入门学习(基础篇)

    vue入门学习总结: vue的一个组件包括三部分:template.style.script. vue的数据在data中定义使用. 数据渲染指令:v-text.v-html.{{}}. 隐藏未编译的标 ...

  2. [STL] queue 队列 priority_queue 优先队列

  3. Python学习零基础<入门必学>

    1. 注释注释 是任何存在于 # 号右侧的文字,其主要用作写给程序读者看的笔记. 2. 字面常量一个字面常量(Literal Constants)的例子是诸如 5.1.23 这样的数字,或者是如 这是 ...

  4. 09-Python入门学习-函数基础与参数

    一.函数基础 1.定义函数的三种形式 1.1 无参函数 def foo(): print('from foo') foo() 1.2 有参函数 def bar(x,y): print(x,y) bar ...

  5. 03-Python入门学习-Python基础

    一.与用户交互 1.什么是与用户交互 程序等待用户输入一些数据,然后程序执行完毕后为用户反馈信息 2.为何程序要与用户交互 为了让计算机能够像人一样与用户的交互 3.如何用 在python3中:inp ...

  6. 🚴‍♂️全套MySQL数据库教程_Mysql基础入门教程,零基础小白自学MySQL数据库必备教程☔ #002 # 第二单元 MySQL数据类型、操作表#

    二.本单元知识点概述 (Ⅰ)知识点概述 二.本单元教学目标 (Ⅰ)重点知识目标 1.Mysql的数据类型2.如何选择数据类型3.创建表4.修改表5.删除表 (Ⅱ)能力目标 1.熟练创建数据库及删除数据 ...

  7. CTF入门学习2->Web基础了解

    Web安全基础 00 Web介绍 00-00 Web本意是网,这里多指万维网(World Wide Web),是由许多互相连接的超文本系统组成的,通过互联网访问. Web是非常广泛的互联网应用,每天都 ...

  8. 谁都能听懂的Redux+Redux-Saga超级傻瓜教程

    对不起本文确实有标题党的嫌疑:) 想要理解本文还是要先会用react和es6,如果连react和es6都不知道是什么的话我也没辙:( 如果你选择用react来开发应用,并且你没对各个组件的状态进行应有 ...

  9. 条件期望:Conditional Expectation 举例详解之入门之入门之草履虫都说听懂了

    我知道有很多人理解不了 "条件期望" (Conditional Expectation) 这个东西,有的时候没看清把随机变量看成事件,把 \(\sigma\)-algebra 看成 ...

  10. PHP 入门学习教程及进阶(源于知乎网友的智慧)

    思过崖历程: 自学的动机.自学的技巧.自学的目标三个方面描述学习PHP的经历 一.自学的动机: 一定要有浓厚的兴趣,兴趣是最后的老师,可以在你迷茫的时候不断地支撑着你走下去. 自学不是为了工作,不是为 ...

随机推荐

  1. C语言||一作业04

    作业头 这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/SE2020-3 这个作业要求在哪 https://edu.cnblogs.com/campus ...

  2. openEuler22.09初始化脚本

    #!/bin/bash s=`nmcli d | grep "已断开" | awk '{print $1}'` echo /etc/sysconfig/network-script ...

  3. oracle相关知识

    1. 给表字段添加注释的语法 comment on column 表名.字段名 is '注释信息'; 2. 数据库字段重命名 alter table ORGAN_PARTER_EXT_TWO rena ...

  4. k8s配置ingress的https访问

    一.部署步骤 1.安装nginx-ingress-controller 2.创建secret绑定证书 3.创建测试服务 4.创建ingress 5.测试https访问 二.安装nginx-ingres ...

  5. Core_DataCollect BacNet说明

    /* * BACnet_AI 0 模拟输入.定义一个标准对象,其属性表示模拟输入的外部可见特征. BACnet_AO 1 模拟输出.定义一个标准对象,其属性表示模拟输出的外部可见特征. BACnet_ ...

  6. Day3 准备步入入门.ok

    安装开发环境(6.21周一) 卸载JDK 删除Java的安装目录 打开我的电脑-->属性-->高级系统设置-->环境变量 删除JAVA_HOME 删除path下添加的JAVA目录 安 ...

  7. vscode设置终端主题,设置终端选中颜色

    vscode定义主题色官网: https://code.visualstudio.com/api/references/theme-color#integrated-terminal-colors 问 ...

  8. pintia 3-7-5 逆波兰表达式求值 (20 分)

    3-7-5 逆波兰表达式求值 (20 分) 逆波兰表示法是一种将运算符(operator)写在操作数(operand)后面 的描述程序(算式)的方法.举个例子,我们平常用中缀表示法描述的算式(1 + ...

  9. 【基础知识】C++算法基础(快速排序)

    快速排序: 1.执行流程(一趟快排): 2.一趟快排的结果:获得一个枢纽,在此左边皆小于此数,在此右边皆大于此数,因此可以继续使用递归获得最终的序列.

  10. ZFBJ - 1 - 42 - NO.1