热门标签 | 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



推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 一、什么是闭包?有什么作用什么是闭包闭包是定义在一个函数内部的函数,它可以访问父级函数的内部变量。当一个闭包被创建时,会关联一个作用域—— ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • BZOJ1233 干草堆单调队列优化DP
    本文介绍了一个关于干草堆摆放的问题,通过使用单调队列来优化DP算法,求解最多可以叠几层干草堆。具体的解题思路和转移方程在文章中进行了详细说明,并给出了相应的代码示例。 ... [详细]
  • PHP引用的概念和用法详解
    本文详细介绍了PHP中引用的概念和用法。引用是指不同的变量名访问同一个变量内容,类似于Unix文件系统中的hardlink。文章从引用的定义、作用、语法和注意事项等方面进行了解释和示例。同时还介绍了对未定义变量使用引用的情况,以及在函数和new运算符中使用引用的注意事项。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
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社区 版权所有