C++ STL之priority_queue
时间:2022-04-26
本文章向大家介绍C++ STL之priority_queue,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
STL中的priority_queue(优先队列)是一种会按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序的容器,不同优先级的情况下,top()上永远是最高优先级的数据,其底层采用的是堆结构(默认大顶堆)。注意相同优先级下并没有先进先出,后面的例子中可以看到
头文件#include<queue>
标准库默认使用元素类型的<操作符来确定它们之间的优先级关系,数据越大优先级越高,想要改变优先级的界定方式的话需要重载<操作符。
先看个最简单的:
#include<iostream>
#include<queue>
using namespace std;
int main()
{
priority_queue<int>pq;
pq.push(5);
pq.push(4);
pq.push(3);
pq.push(4);
pq.push(8);
pq.push(2);
while(!pq.empty())
{
cout<<pq.top()<<endl;
pq.pop();
}
return 0;
}
运行结果:
下面再看一个例子:
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int value;
int pro;
friend bool operator <(node n1,node n2)//自定义priority_queue结构中优先级的界定方式
{
return n1.pro<n2.pro;
}
};
int main()
{
priority_queue<node>pq;
node temp;
temp.pro=5;
temp.value=10;
pq.push(temp);
temp.pro=4;
temp.value=11;
pq.push(temp);
temp.pro=3;
temp.value=7;
pq.push(temp);
temp.pro=4;
temp.value=9;
pq.push(temp);
temp.pro=6;
temp.value=9;
pq.push(temp);
temp.pro=4;
temp.value=5;
pq.push(temp);
while(!pq.empty())
{
cout<<pq.top().pro<<" "<<pq.top().value<<endl;
pq.pop();
}
return 0;
}
结果:
从这个例子中可以看到,对于相同优先级的三个pro值为4的结构体,输入顺序中value值依次为11,9,5,而输出确实5,11,9,所以相同优先级的情况下并没有先进先出。
如果想把底层改成小顶堆结构,需要重载<就可以了,如下面的例子:
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int value;
int pro;
friend bool operator <(node n1,node n2)//自定义priority_queue结构中优先级的界定方式
{
return n1.pro>n2.pro;
}
};
int main()
{
priority_queue<node>pq;
node temp;
temp.pro=5;
temp.value=10;
pq.push(temp);
temp.pro=4;
temp.value=11;
pq.push(temp);
temp.pro=3;
temp.value=7;
pq.push(temp);
temp.pro=4;
temp.value=9;
pq.push(temp);
temp.pro=6;
temp.value=9;
pq.push(temp);
temp.pro=4;
temp.value=5;
pq.push(temp);
while(!pq.empty())
{
cout<<pq.top().pro<<" "<<pq.top().value<<endl;
pq.pop();
}
return 0;
}
结果如下:
最后吐槽一下,priority_queue为什么会是一种queue呢?从它上面我根本没看到队列先进先出的特点。
- python-IDLE清屏和标记行数,其他推荐
- 从0到1:PostCSS 插件开发最佳实践
- VUE 入门基础(4)
- 实例演示Android异步加载图片
- 使用OData协议查询Windows日志
- Android之Notification介绍
- postcss-lazysprite: 一种生成CSS 雪碧图的懒惰姿势
- Activity间中使用Intent传值
- VUE 入门基础(3)
- ASP.NET MVC 2 转换工具
- 使用Sysinternals工具定时休眠Windows Server 2008 R2
- Android中BroadcastReceiver广播
- 启用Windows 7/2008 R2 XPS Viewer
- Spring历史版本变迁和如今的生态帝国
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Redis Linux系统参数最佳配置
- 实现Promise其它API
- 使用sysbench进行压测 Part1 sysbench安装
- Java并发编程(07):Fork/Join框架机制详解
- PostgreSQL Pgbouncer 到底怎么使用,疗效有多大
- 微信练手小程序源码 - 日历(含各种功能组件)
- Redis 5.0.8安装
- Redis 主从搭建
- Redis 5.0.8 主从+哨兵的搭建
- ammo.js-bullet物理引擎碰撞检测
- TKE上动态部署jenkins slaves
- CVE-2017-0261及利用样本分析
- 流水的NLP铁打的NER:命名实体识别实践与探索
- Spring Boot入门系列(十七)Mybatis创建自定义mapper 实现多表关联查询!
- 让你笑的七个linux命令