详解C++ STL priority_queue 容器

详解C++ STL priority_queue 容器

本篇随笔简单介绍一下(C++STL)(priority_queue)容器的使用方法和常见的使用技巧。

priority_queue容器的概念

(priority_queue)在英文中是优先队列的意思。

队列是一种基本的数据结构。其实现的基本示意图如下所示:

详解C++ STL priority_queue 容器

(C++STL)中的优先队列就是在这个队列的基础上,把其中的元素加以排序。其内部实现是一个二叉堆。所以优先队列其实就是把堆模板化,将所有入队的元素排成具有单调性的一队,方便我们调用。

priority_queue容器的声明

(priority_queue)容器存放在模板库:#include<queue>里,使用前需要先开这个库。

这里需要注意的是,优先队列的声明与一般(STL)模板的声明方式并不一样。事实上,我认为其是(C++STL)中最难声明的一个容器。

大根堆声明方式:

大根堆就是把大的元素放在堆顶的堆。优先队列默认实现的就是大根堆,所以大根堆的声明不需要任何花花肠子,直接按(C++STL)的声明规则声明即可。

#include<queue>
priority_queue<int> q;
priority_queue<string> q;
priority_queue<pair<int,int> > q;

(C++)中的(int,string)等类型可以直接比较大小,所以不用我们多操心,优先队列自然会帮我们实现。但是如果是我们自己定义的结构体,就需要进行重载运算符了。关于重载运算符的讲解,请参考这篇博客:

重载运算符语法讲解

小根堆声明方式

大根堆是把大的元素放堆顶,小根堆就是把小的元素放到堆顶。

实现小根堆有两种方式:

第一种是比较巧妙的,因为优先队列默认实现的是大根堆,所以我们可以把元素取反放进去,因为负数的绝对值越小越大,那么绝对值较小的元素就会被放在前面,我们在取出的时候再取个反,就瞒天过海地用大根堆实现了小根堆。

第二种:

小根堆有自己的声明方式,我们记住即可(我也说不明白道理):

priority_queue<int,vector<int>,greater<int> >q;

注意,当我们声明的时候碰到两个"<"或者">"放在一起的时候,一定要记得在中间加一个空格。这样编译器才不会把两个连在一起的符号判断成位运算的左移/右移。

priority_queue容器的使用方法

(priority_queue)容器的使用方法大致如下表所示:

用法 作用
q.top() 返回priority_queue的首元素
q.push() 向priority_queue中加入一个元素
q.size() 返回priority_queue当前的长度(大小)
q.pop() 从priority_queue末尾删除一个元素
q.empty() 返回priority_queue是否为空,1为空、0不为空

注意:priority_queue取出队首元素是使用(top),而不是(front),这点一定要注意!!

原文链接: https://www.cnblogs.com/fusiwei/p/11823053.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    详解C++ STL priority_queue 容器

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/305591

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月16日 上午2:56
下一篇 2023年2月16日 上午2:56

相关推荐