STL-priority_queue用法(重点: 升序,小根堆)

简介:

面,总结一下priority_queue的用法,免得以后又忘记了,还要到处找(C++的STL的库,异常处理、多态、泛型编程,自己还要多积累才是。)

#include <queue>

using namespace std; (记得包含头文件噢)

 

1.  priority_queue在STL内部定义的原型是:

      template< class T ,

                     class Sequence=vector<T> ,

                     classCompare=less<typename Sequence::value_type> > (主要,要一个空格,否则编译器会当做右移操作符,报错)

                     class priority_queue;

 

最简单的用法:

priority_queue<int>  q;   // 注意上面第二个参数,和第三个参数的默认值。

                                   // 对于内置的对象,可以这么简单的定义;特别注意第三个参数, 默认的小于号(<), 即降序排序,默认的是大根堆。权值最大的会被弹出来。

 最常见的用法:

priority_queue<Node> q;   // 恩,自己定义的类型。

----------上面两种类型,当自己需要的堆是小根堆的时候,即元素按升序(从小到达的弹出),那么必须改写比较函数.

即对于STL中优先队列的使用,最重要的就是这个比较函数的书写(或对'<', '>'的重载)了,常见的方面有下面两种:

 

1. 方法一,重载'<' ('>')运算符:

//Overload the < operator.bool operator< (const Student& structstudent1, const Student &structstudent2){
return structstudent1.nAge > structstudent2.nAge;
}
//Overload the > operator.bool operator> (const Student& structstudent1, const Student &structstudent2){
return structstudent1.nAge < structstudent2.nAge;
}
 具体使用的时候://Declare a priority_queue and specify the ORDER as <//The priorities will be assigned in the Ascending Order of
Agepriority_queue<Student, vector<Student>,less<vector<Student>::value_type> > pqStudent1;
----因为默认的less, 所以重载'<'后,第二个参数,第三个参数可以省略//declare a priority_queue and specify the ORDER as >//The priorities will be assigned in the Descending Order of Agepriority_queue<Student, vector<Student>,greater<vector<Student>::value_type> > pqStudent2;
------如果重载的是'>'运算符,必须将第三个参数写出来,greater 

2. 方法二,构造‘比较函数’,然后指定priority_queue的第三个参数

struct cmp

{

       bool operator() (const Node& a, const Node &b)

        {

                return a.key > b.key;      // 第一个元素大于第二个元素,返回真时; 对应的是小根堆,升序!

        }                                         // 当想要大根堆,降序时,让它返回false就好,即用'<' (默认值)

}

多关键字比较、'排序':

struct cmp {
     bool operator() (const node &a, const node &b)
     {
         if (a.current < b.current)    return false;     //第一关键字,为升序,小根堆  (第一个大于第二的时候,返回真)
         else if (a.current == b.current)   return (a.year > b.year);   // 第二关键字,也为升序
         else return true;
     }
};

priority_queue<node, vector<node>, cmp> p;

-----------其实这两种方法,很常见。使用STL的algorithm里的sort等算法时,都需要指定!

2. 对于优先队列使用时,特别是多个case的时候,要注意初始的清空!

while ( !q.empty() )  q.pop();    //效率不高?为什么没有提供clear的功能噢。

 q.push( cur );   q.top();   q.pop();  q.size();

恩,对于,对于STL中优先队列的时候应该没问题了。主要两点:  1. 比较函数或运算符的重载  2. 注意case之间的清空!

本文转自博客园知识天地的博客,原文链接:STL-priority_queue用法(重点: 升序,小根堆),如需转载请自行联系原博主。

相关文章
|
30天前
|
存储 算法 C语言
【C++入门到精通】C++入门 —— priority_queue(STL)优先队列
本文介绍了C++的STL组件`std::priority_queue`,它是一个容器适配器,实现优先队列数据结构,通常基于堆实现。文章讨论了优先队列的基本概念、特点和底层堆结构,强调了其自动排序和优先级最高元素的访问。还展示了如何定义、插入、访问和移除元素,以及自定义比较函数。此外,提供了模拟实现`priority_queue`的代码示例,探讨了仿函数的作用,包括默认的`std::less`和自定义比较函数。文章鼓励读者进一步探索C++的优先队列及其应用。
25 3
|
7天前
|
存储 算法 C++
【C++初阶】STL详解(九) priority_queue的使用与模拟实现
【C++初阶】STL详解(九) priority_queue的使用与模拟实现
20 0
|
3月前
|
测试技术 C++
c++优先队列priority_queue(自定义比较函数)
c++优先队列priority_queue(自定义比较函数)
73 0
|
4月前
|
C++ 容器
【C++】STL容器——探究List与Vector在使用sort函数排序的区别(14)
【C++】STL容器——探究List与Vector在使用sort函数排序的区别(14)
|
6月前
|
算法 Serverless C++
【C++】STL使用仿函数控制优先级队列priority_queue
【C++】STL使用仿函数控制优先级队列priority_queue
|
6月前
|
存储 算法 程序员
stack、queue、priority_queue的使用和简单实现【STL】
stack、queue、priority_queue的使用和简单实现【STL】
26 0
|
10月前
|
存储 算法 C++
C++【STL】之priority_queue学习
C++ STL 优先级队列,常用接口的使用和模拟实现详细讲解,干货满满!
68 1
C++【STL】之priority_queue学习
|
11月前
|
存储 算法 C语言
【C++】通过priority_queue、reverse_iterator加深对于适配器和仿函数的理解
【C++】通过priority_queue、reverse_iterator加深对于适配器和仿函数的理解
|
存储 算法 C语言
【C++初阶】十一、STL---priority_queue(总)
目录 一、priority_queue介绍 二、priority_queue使用 三、仿函数 四、priority_queue模拟实现 4.1 版本1 4.2 版本2
96 0
【C++初阶】十一、STL---priority_queue(总)
|
存储 算法 编译器
初阶C++ 第五节—STL之Stack和Queue(deque+priority_queue)+适配器 + 仿函数 + 模板进阶
头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是必vector高的。
148 0
初阶C++ 第五节—STL之Stack和Queue(deque+priority_queue)+适配器 + 仿函数 + 模板进阶