热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

priority_queue的用法(转)

priority_queue调用STL里面的make_heap(),pop_heap(),push_heap()算法实现,也算是堆的另外一种形式。先写一个用STL里面

priority_queue调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法实现,也算是堆的另外一种形式。先写一个用 STL 里面堆算法实现的与真正的STL里面的 priority_queue用法相似的priority_queue, 以加深对 priority_queue 的理解

?
#include
#include
#include
using namespace std;
class priority_queue
{
    private:
        vector<int> data;
         
    public:
        void push( int t ){
            data.push_back(t);
            push_heap( data.begin(), data.end());
        }
         
        void pop(){
            pop_heap( data.begin(), data.end() );
            data.pop_back();
        }
         
        int top() { return data.front(); }
        int size() { return data.size(); }
        bool empty() { return data.empty(); }
};
int main()
{
    priority_queue test;
    test.push( 3 );
    test.push( 5 );
    test.push( 2 );
    test.push( 4 );
     
    while( !test.empty() ){
        cout <
        test.pop(); }
         
    return 0;
}
STL里面的 priority_queue 写法与此相似&#xff0c;只是增加了模板及相关的迭代器什么的。 

priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:
priority_queue
其中Type 为数据类型&#xff0c; Container 为保存数据的容器&#xff0c;Functional 为元素比较方式。
Container 必须是用数组实现的容器&#xff0c;比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator<, 所以如果你把后面俩个参数缺省的话&#xff0c;
优先队列就是大顶堆&#xff0c;队头元素最大。
?
#include
#include
using namespace std;
int main(){
    priority_queue<int> q;
     
    for( int i&#61; 0; i<10; &#43;&#43;i ) q.push( rand() );
    while( !q.empty() ){
        cout <
        q.pop();
    }
     
    getchar();
    return 0;
}
如果要用到小顶堆&#xff0c;则一般要把模板的三个参数都带进去。
STL里面定义了一个仿函数 greater<>&#xff0c;对于基本类型可以用这个仿函数声明小顶堆
?
#include
#include
using namespace std;
int main(){
    priority_queue<int, vector<int>, greater<int> > q;
     
    for( int i&#61; 0; i<10; &#43;&#43;i ) q.push( rand() );
    while( !q.empty() ){
        cout <
        q.pop();
    }
     
    getchar();
    return 0;
}

 

对于自定义类型&#xff0c;则必须自己重载 operator<或者自己写仿函数
?
#include
#include
using namespace std;
struct Node{
    int x, y;
    Node( int a&#61; 0, int b&#61; 0 ):
        x(a), y(b) {}
};
bool operator<( Node a, Node b ){
    if( a.x&#61;&#61; b.x ) return a.y> b.y;
    return a.x> b.x;
}
int main(){
    priority_queue q;
     
    for( int i&#61; 0; i<10; &#43;&#43;i )
    q.push( Node( rand(), rand() ) );
     
    while( !q.empty() ){
        cout <&#39; &#39; <
        q.pop();
    }
     
    getchar();
    return 0;
}

 

自定义类型重载 operator<后&#xff0c;声明对象时就可以只带一个模板参数。
但此时不能像基本类型这样声明
priority_queue, greater >;
原因是 greater 没有定义&#xff0c;如果想用这种方法定义则可以按如下方式:
?
#include
#include
using namespace std;
struct Node{
    int x, y;
    Node( int a&#61; 0, int b&#61; 0 ):
        x(a), y(b) {}
};
struct cmp{
    bool operator() ( Node a, Node b ){
        if( a.x&#61;&#61; b.x ) return a.y> b.y;
         
        return a.x> b.x; }
};
int main(){
    priority_queue, cmp> q;
     
    for( int i&#61; 0; i<10; &#43;&#43;i )
    q.push( Node( rand(), rand() ) );
     
    while( !q.empty() ){
        cout <&#39; &#39; <
        q.pop();
    }
     
    getchar();
    return 0;
}
//以上代码实现的是一个小顶堆

 

转载:http://blog.chinaunix.net/space.php?uid&#61;533684&do&#61;blog&cuid&#61;2615612

ps:如果重载operator > 可直接使用priority_queue,greater>

转:https://www.cnblogs.com/tanhehe/articles/2965873.html



推荐阅读
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
  • 本文提出了一种基于栈结构的高效四则运算表达式求值方法。该方法能够处理包含加、减、乘、除运算符以及十进制整数和小括号的算术表达式。通过定义和实现栈的基本操作,如入栈、出栈和判空等,算法能够准确地解析并计算输入的表达式,最终输出其计算结果。此方法不仅提高了计算效率,还增强了对复杂表达式的处理能力。 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4277。作者:Bob Lee,日期:2012年9月15日。题目描述:给定n个木棍,求可以组成的不同三角形的数量,最多15根木棍。 ... [详细]
  • 题目《BZOJ2654: Tree》的时间限制为30秒,内存限制为512MB。该问题通过结合二分查找和Kruskal算法,提供了一种高效的优化解决方案。具体而言,利用二分查找缩小解的范围,再通过Kruskal算法构建最小生成树,从而在复杂度上实现了显著的优化。此方法不仅提高了算法的效率,还确保了在大规模数据集上的稳定性能。 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • 你的问题在于:1. 代码格式混乱,缺乏必要的缩进,导致可读性极低;2. 使用 `strlen()` 和 `malloc()` 函数时,必须包含相应的头文件;3. `write()` 函数的返回值处理不当,建议检查并处理其返回值以确保程序的健壮性。此外,建议在编写代码时遵循良好的编程规范,增加代码的可维护性和可读性。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
author-avatar
你给的喜欢--触不成及
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有