//基本用法
int main()
{
priority_queue<int, vector<int>, greater<>> qu;
int arr[] = {1,34,4,56,6,3,1,2,3,45};
int len = sizeof(arr) / 4;
for (int i = 0; i < len; i++) {
qu.push(arr[i]);
}
while (!qu.empty())
{
cout << qu.top() << " ";
qu.pop();
}
cout << endl;
return 0;
}
//输出:1 1 2 3 3 4 6 34 45 56 相当于qu内部帮我们按照指定的规则(greater<>)排了序;
//除了greate<> 和less<>外;我们可以自己定制比较大小的仿函数,方便其他自定义类型的比较;
//拿链表节点举例子;
struct f{
operator()(ListNode*p,ListNode*q){
return p->val>q->val; //这里注意,底层比大小类似于堆排序中的,parent和child比,所以 大根堆--> 小于号<;小根堆--> 大于号>;!
}
};
priority_queue<int, vector<int>, f> qu;
关于less建大根堆,输出降序序列,greater建小根堆,输出升序序列,这点和sort()函数相反,参考我的这篇博客
底层原理
priority_queue底层维护着一个对应类型的,vector物理结构,但相当于堆排序的结构,这个vector逻辑结构是一个二叉堆;
每次插入数据,我们插在堆尾(vector尾),之后向上调整到合适的位置!
每次pop数据,就swap(堆顶 和 尾巴)的数据,这样方便拿走堆顶元素以后,vector结构size-1,而且换过去的堆尾元素向下调整一下就行logN;文章来源:https://www.toymoban.com/news/detail-595391.html
堆排序和priority_queue都是借助vector的物理结构+二叉堆的逻辑结构,但是这两个不是一个东西注意一下;文章来源地址https://www.toymoban.com/news/detail-595391.html
到了这里,关于优先级队列priority_queue的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!