【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

相关文章

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解