平常使用queue,今天遇到一个priority_queue,记录一下啊
queue:
是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。
priority_queue:
元素按照优先级排序了,当访问元素时,具有最高优先级的元素最先pop。优先队列具有最高级先出 (first in, largest out)的行为特征。
优先队列具有queue的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。
参考:c++二叉堆
先看看简单的例子:
class QueData { public: QueData(int data, string name) :m_data(data), m_strName{ name } { ; } virtual ~QueData() { ; } public: bool operator < (const QueData &data) const //注意此处重载函数后面的const,曾经遇到过const没加上,报错问题 { return m_data < data.m_data; } string name() { return m_strName; } int data() { return m_data; } private: int m_data = 0; string m_strName{ "" }; }; #include <queue> #include <functional> //std::greater void testPriorityQue() { std::cout << "From large to small, default: less" << std::endl; std::priority_queue<int> priorityQueInt; //等同于: //priority_queue<int, std::vector<int>, std::less<int> > priorityQueInt; priorityQueInt.push(8); priorityQueInt.push(6); priorityQueInt.push(7); priorityQueInt.push(9); priorityQueInt.push(10); //默认由大到小 while(!priorityQueInt.empty()) { std::cout << priorityQueInt.top() << std::endl; priorityQueInt.pop(); }
///////////////////////////
std::cout << "From small to large, use: greater" << std::endl; //更改到-->小到大: std::priority_queue<int, std::vector<int>, std::greater<int> > priorityGreaterQueInt; priorityGreaterQueInt.push(8); priorityGreaterQueInt.push(6); priorityGreaterQueInt.push(7); priorityGreaterQueInt.push(9); priorityGreaterQueInt.push(10); while (!priorityGreaterQueInt.empty()) { std::cout << priorityGreaterQueInt.top() << std::endl; priorityGreaterQueInt.pop(); } /////////////////////// std::cout << "For customize type defined, use override operator <" << std::endl; std::priority_queue<QueData> que; QueData data8{ 8,"8" }; que.push(data8); QueData data6{ 6,"6" }; que.push(data6); QueData data7{ 7,"7" }; que.push(data7); QueData data9{ 9,"9" }; que.push(data9); QueData data10{ 10,"10" }; que.push(data10); //大小顺序由QueData的operator <决定 while (!que.empty()) { QueData queData = que.top(); std::cout << queData.data() << std::endl; que.pop(); } } int main() { testPriorityQue(); return 0; }
输出:
From large to small, default: less
10
9
8
7
6
From small to large, use: greater
6
7
8
9
10
For customize type defined, use override operator <
10
9
8
7
6
Press any key to continue . . .
定义:http://www.cplusplus.com/reference/queue/priority_queue/?kw=priority_queue
priority_queue<Type, Container, Functional>
Type : 数据类型, 基本类型或者自定义类
Container : 容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector)
Functional :比较的方式, 自定义类型 通过override operator <实现,
基本类型,stl functional提供了greater和less来比较大小,
greater和less是std实现的两个仿函数, 其实现就是类中实现一个operator(),具体可以查看functional
当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,不填,默认是less,从大到小
1 //默认:大->小,大顶堆
std::priority_queue<int> priorityQueInt;
priority_queue<int, std::vector<int>, std::less<int> > priorityQueInt;
2 //小->大,小顶堆
std::priority_queue<int, std::vector<int>, std::greater<int> > priorityGreaterQueInt;