STL--priority_queue £神魔★判官ぃ 2022-07-10 09:28 141阅读 0赞 priority\_queue需要头文件**\#include <queue>** priority\_queue**默认是最大堆**(大顶堆, 用 < 比较符来确定优先级,既 a < b == 1 则表示b 优先级大于a,则pop()会优先弹出b; 重载 < 运算符,return a > b 则使之成为最小堆 ) **priority\_queue用法**: priority\_queue 调用 STL里面的 make\_heap(), pop\_heap(), push\_heap() 算法实现,也算是堆的另外一种形式。 priority\_queue 对于基本类型的使用方法相对简单。 他的模板声明带有三个参数,priority\_queue<Type, Container, Functional>, Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,优先队列就是大顶堆,队头元素最大。 在优先队列中,优先级高的元素先出队列。 标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。 优先队列的第一种用法,也是最常用的用法: ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] priority\_queue < int > qi; 通过<操作符可知在整数中元素大的优先级高。 故示例1中输出结果为:9 6 5 3 2 第二种方法: 在示例1中,如果我们要把元素从小到大输出怎么办呢? 这时我们可以传入一个比较函数,使用functional.h函数对象作为比较函数。 ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] priority\_queue < int , vector < int > , greater < int > > qi2; 其中 第二个参数为容器类型。 第二个参数为比较函数。 故示例2中输出结果为:2 3 5 6 9 重载()操作符来定义优先级 \#include<iostream> \#include<vector> \#include<queue> using namespace std; struct myCompare \{ bool operator()(const int &a,const int &b) \{ if(a!=b) return a>b; else return a>b; \} \}; int main() \{ priority\_queue<int,vector<int>,myComp> pq; \} 第三种方法: 自定义优先级。 ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] struct node ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -]\{ ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] friend bool operator < (node n1, node n2) ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] \{ ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] return n1.priority < n2.priority; ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] \} ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] int priority; ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] int value; ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -]\}; 在该结构中,value为值,priority为优先级。 通过自定义operator<操作符来比较元素中的优先级。 在示例3中输出结果为: 优先级 值 9 5 8 2 6 1 2 3 1 4 但如果结构定义如下: ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] struct node ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -]\{ ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] friend bool operator > (node n1, node n2) ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] \{ ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] return n1.priority > n2.priority; ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] \} ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] int priority; ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -] int value; ![priority\_queue用法(转载) - 小六 - 小六的博客][priority_queue_ - _ -]\}; 则会编译不过(G++编译器) 因为标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。 而且自定义类型的<操作符与>操作符并无直接联系,故会编译不过。 [priority_queue_ - _ -]: /images/20220709/caba5e28efe147a88ddb44c526f87abd.png
还没有评论,来说两句吧...