【C++】priority_queue的用法(模板参数的实例)

2024-06-13 15:20

本文主要是介绍【C++】priority_queue的用法(模板参数的实例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【C++】priority_queue的用法

文章目录

  • 【C++】priority_queue的用法
    • 大根堆
    • 小根堆
    • 自定义类型优先级队列

使用priority_queue需要包含头文件 <queue>
其模板申明带3个参数:priority_queue<Type, Container, Functional>,其中Type 为数据类型,Container为保存数据的容器,Functional 为元素比较方式。
其中Container必须是使用数组实现的容器,例如vector、dequeue等,不能使用list。

大根堆

该函数使用,后两个参数可以缺省,例如可以声明这样一个优先级队列:priority_queue<int> q,此时元素的比较方式默认用operator<,优先级队列就是大根堆,队头元素最大。

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int main(){priority_queue<pair<int,int> > coll;pair<int,int> a(3,4);pair<int,int> b(3,5);pair<int,int> c(4,3);coll.push(c);coll.push(b);coll.push(a);while(!coll.empty()){cout<<coll.top().first<<"\t"<<coll.top().second<<endl;coll.pop();}return 0;
}//-------------------------------------
//来源于https://www.cnblogs.com/shona/p/12163381.html

小根堆

如果要实现小根堆,则需要把模板的3个参数都填写清除。STL里面定义了一个仿函数greater<>,基本类型可以用这个仿函数声明小顶堆。以下代代码返回pair的比较结果,先按照pair的first元素升序,first元素相等时,再按照second元素升序:

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int main(){priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > coll;pair<int,int> a(3,4);pair<int,int> b(3,5);pair<int,int> c(4,3);coll.push(c);coll.push(b);coll.push(a);while(!coll.empty()){cout<<coll.top().first<<"\t"<<coll.top().second<<endl;coll.pop();}return 0;
}
//------------------------------------------------------------
//来源于https://www.cnblogs.com/shona/p/12163381.html

自定义类型优先级队列

对于自定义类型优先级队列,则必须重载operator<函数。
例如,我们希望使用优先级队列实现A* 算法 priority_queue;

优先级队列的结构为(open list):

std::priority_queue<std::pair<double, Node>, std::vector<std::pair<double, Node>>, greater> frontier;    // 创建为小根堆 open list

由于我们需要实现一个小根堆,所以三个参数都需要表明,模板中第一个参数表明单个元素的构成:std::pair<double, Node>,单个元素是有一个double数据和一个Node数据共同组成的,第二个参数表明优先级队列的存储容器构成std::vector<std::pair<double, Node>>,使用了一个vector来存储单个元素,第三个参数表明元素的比较方式。

struct greater{  constexpr bool operator() (const std::pair<double, Node>& lhs, const std::pair<double, Node>& rhs) const{//默认是less函数  //返回true时,lhs的优先级低于rhs的优先级(lhs排在rhs的后面)  return lhs.first > rhs.first;  }  
};

Node结构体构成:

struct Node{int x, y;Node( int a= 0, int b= 0 ):x(a), y(b) {}
};

通过这个方式,我们实现了一个优先级队列的A* 算法中的open list。

这篇关于【C++】priority_queue的用法(模板参数的实例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1057674

相关文章

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py