STL中的priority_queue(优先队列)是一种会按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序的容器,不同优先级的情况下,top()上永远是最高优先级的数据,其底层采用的是堆结构(默认大顶堆)。注意相同优先级下并没有先进先出,后面的例子中可以看到
头文件#include<queue>
标准库默认使用元素类型的<操作符来确定它们之间的优先级关系,数据越大优先级越高,想要改变优先级的界定方式的话需要重载<操作符。
先看个最简单的:
#include<iostream> #include<queue> using namespace std; int main() { priority_queue<int>pq; pq.push(5); pq.push(4); pq.push(3); pq.push(4); pq.push(8); pq.push(2); while(!pq.empty()) { cout<<pq.top()<<endl; pq.pop(); } return 0; }
运行结果:
下面再看一个例子:
#include<iostream> #include<queue> using namespace std; struct node { int value; int pro; friend bool operator <(node n1,node n2)//自定义priority_queue结构中优先级的界定方式 { return n1.pro<n2.pro; } }; int main() { priority_queue<node>pq; node temp; temp.pro=5; temp.value=10; pq.push(temp); temp.pro=4; temp.value=11; pq.push(temp); temp.pro=3; temp.value=7; pq.push(temp); temp.pro=4; temp.value=9; pq.push(temp); temp.pro=6; temp.value=9; pq.push(temp); temp.pro=4; temp.value=5; pq.push(temp); while(!pq.empty()) { cout<<pq.top().pro<<" "<<pq.top().value<<endl; pq.pop(); } return 0; }
结果:
从这个例子中可以看到,对于相同优先级的三个pro值为4的结构体,输入顺序中value值依次为11,9,5,而输出确实5,11,9,所以相同优先级的情况下并没有先进先出。
如果想把底层改成小顶堆结构,需要重载<就可以了,如下面的例子:
#include<iostream> #include<queue> using namespace std; struct node { int value; int pro; friend bool operator <(node n1,node n2)//自定义priority_queue结构中优先级的界定方式 { return n1.pro>n2.pro; } }; int main() { priority_queue<node>pq; node temp; temp.pro=5; temp.value=10; pq.push(temp); temp.pro=4; temp.value=11; pq.push(temp); temp.pro=3; temp.value=7; pq.push(temp); temp.pro=4; temp.value=9; pq.push(temp); temp.pro=6; temp.value=9; pq.push(temp); temp.pro=4; temp.value=5; pq.push(temp); while(!pq.empty()) { cout<<pq.top().pro<<" "<<pq.top().value<<endl; pq.pop(); } return 0; }
结果如下:
最后吐槽一下,priority_queue为什么会是一种queue呢?从它上面我根本没看到队列先进先出的特点。