`

C++ STL priority_queue的用法

    博客分类:
  • C++
 
阅读更多

      C++中priority_queue的头文件是#include <queue>, priority_queue是调用STL里面的 make_heap(), pop_heap(), push_heap() 算法实现,也算是堆的另外一种形式。

 

      priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:

priority_queue<Type, Container, Functional>,其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。Container 必须是用数组实现的容器,比如vector, deque 但不能用 list. STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,优先队列就是大顶堆,队头元素最大。

 

      如果要用到小顶堆,则一般要把模板的三个参数都带进去。STL里面定义了一个仿函数greater<>,对于基本类型可以用这个仿函数声明小顶堆,如下代码,使用greater<>后,输出的就是队列中最小的,否则缺省为输出最大的。

#include <iostream>
#include <queue>

using namespace std;

int main(){
    priority_queue<int, vector<int>, greater<int> > q;
    
    for( int i= 0; i< 10; ++i ) q.push( rand() );
    while( !q.empty() ){
        cout << q.top() << endl;
        q.pop();
    }
    
    getchar();
    return 0;
}

 

      对于自定义类型,则必须自己重载 operator< 或者自己写仿函数。

 

#include <iostream>
#include <queue>

using namespace std;

struct Node{
    int x, y;
    Node( int a= 0, int b= 0 ):
        x(a), y(b) {}
};

bool operator<( Node a, Node b ){
    if( a.x== b.x ) return a.y> b.y;
    return a.x> b.x; 
}

int main(){
    priority_queue<Node> q;
    
    for( int i= 0; i< 10; ++i )
    q.push( Node( rand(), rand() ) );
    
    while( !q.empty() ){
        cout << q.top().x << ' ' << q.top().y << endl;
        q.pop();
    }
    
    getchar();
    return 0;
}

      自定义类型重载 operator< 后,声明对象时就可以只带一个模板参数。但此时不能像基本类型这样声明priority_queue<Node, vector<Node>, greater<Node> >;原因是 greater<Node> 没有定义,如果想用这种方法定义则可以按如下方式,这样就可以产生一个小顶堆:

 

#include <iostream>
#include <queue>

using namespace std;

struct Node{
    int x, y;
    Node( int a= 0, int b= 0 ):
        x(a), y(b) {}
};

struct cmp{
    bool operator() ( Node a, Node b ){
        if( a.x== b.x ) return a.y> b.y;
        
        return a.x> b.x; }
};

int main(){
    priority_queue<Node, vector<Node>, cmp> q;
    
    for( int i= 0; i< 10; ++i )
    q.push( Node( rand(), rand() ) );
    
    while( !q.empty() ){
        cout << q.top().x << ' ' << q.top().y << endl;
        q.pop();
    }
    
    getchar();
    return 0;
} 

 

 

来源:http://blog.chinaunix.net/uid-533684-id-2100009.html

 

 

分享到:
评论

相关推荐

    STL中priority_queue

    下面,我们将详细介绍 priority_queue 的使用方法和实现原理。 priority_queue 的基本概念 priority_queue 是一种特殊的队列,它可以自动对元素进行排序,使得队列中最大的元素总是位于队首。这种特性使得 ...

    STL.rar_C++ STL_C++ STL_STL_STL c++_STL教程

    - 迭代器的使用方法,包括递增、递减、比较和解引用。 - 算法的使用,如如何使用sort对容器排序,或使用find查找特定元素。 - 特殊容器如stack(栈)、queue(队列)和priority_queue(优先队列)的使用场景和操作...

    priority_queue.pdf

    从提供的文件内容来看,文档标题为"priority_queue.pdf",描述同样为"priority_queue.pdf",说明该文档是关于优先队列(priority queue)的,它是C++标准模板库(STL)中的一个重要容器。由于文档内容是以OCR扫描...

    STL_C++stl实现_

    在C++ STL中,`&lt;queue&gt;`头文件提供了`priority_queue`类模板,用于实现这个数据结构。它通常与堆排序算法相关联,因为内部结构通常是二叉堆。 2. **mapA和mapB**:`map`是STL中的一种关联容器,它存储键值对,每个...

    EffectiveSTL_STL_C++_experience_gas841_C++STL_

    "STL C++ experience gas841 C++STL"这些标签反映了本书内容的核心,包括STL、C++实战经验以及对STL库的深入探讨。 STL是C++标准库中的一个重要部分,它包括了容器(如vector、list、set等)、迭代器、算法和函数...

    stl操作_c++stl操作_

    优先队列(Priority Queue)是STL提供的一种特殊容器,它遵循“最大优先”或“最小优先”的原则,每次删除或获取的元素总是最大或最小的一个。C++中的`std::priority_queue`类实现了这个功能,你可以指定元素的比较...

    c++stack_和_queue用法

    本文详细介绍了C++ STL中的`stack`、`queue`和`priority_queue`的使用方法。通过这些容器,可以有效地处理各种数据结构问题,如逆波兰表达式求值、括号匹配、任务调度等。掌握这些容器的使用不仅能够提高编程效率,...

    侯捷STL课件_C++_候捷课件stl_c++侯捷课件_

    侯捷会详细解析这些适配器的工作原理和使用方法。 6. **内存管理(Memory Management)**:STL容器通常使用智能指针(如auto_ptr、shared_ptr、unique_ptr)来管理动态分配的对象,确保内存安全。课件中会讨论这些...

    数据结构课程设计优先队列数据(priority_queue)类型

    在C++标准模板库(STL)中,提供了`&lt;queue&gt;`头文件内的`priority_queue`容器,它封装了上述操作。用户可以自定义比较函数对象以实现最大堆或最小堆,并可以方便地进行插入、删除和查看操作。 **四、实现方式** 1. *...

    c++API.zip_-baijiahao_C++帮助文档_Load c++_STL库_stl API

    6. 适配器:如stack、queue、priority_queue,它们将基础容器包装成特定的行为模式,如后进先出(LIFO)的栈、先进先出(FIFO)的队列和优先级队列。 在"C++API.chm"文件中,你可以找到关于这些组件的详细说明,...

    编写优先队列数据(priority_queue)

    在C++中,`priority_queue`是STL(Standard Template Library)的一部分,提供了对优先队列的支持。然而,自定义优先队列可以提供更多的灵活性,比如在上述代码中,我们看到了一个基于最大堆实现的自定义优先队列。 ...

    C++_STL_Addison_wesley

    ### C++ STL (Standard Template Library) 知识点解析 #### 一、C++ STL 概述 在《C++ STL标准模板库》这本书中,作者 Ulrich Breymann 详细介绍了 C++ Standard Template Library(简称 STL)的概念、设计原理...

    C++STL详解PPT

    C++STL详解 C++STL 库是 C++ 语言中非常重要的一部分,它提供了许多有用的容器、算法和迭代器,帮助开发者更方便地编写高效、可重用的代码。 泛型程序设计是 C++ 语言中非常重要的一部分,它允许开发者编写通用的...

    STL.rar_STL_STL PPT_iterator_stl p

    提到的"STL的入门ppt"很可能是介绍这些概念的教程资料,对于初学者来说,这是一个很好的起点,可以帮助理解STL的基本原理和使用方法。 通过深入学习和实践STL,C++程序员可以写出更高效、更易于维护的代码,同时...

    source-stl.rar_STL 源码_stl source_stl 代码

    5. **适配器**:适配器是一种设计模式,STL中有两种主要类型的适配器:容器适配器(如stack、queue和priority_queue)和迭代器适配器。它们可以将现有的容器或迭代器转换为其他形式,以满足特定需求。 6. **内存...

    【C++入门到精通】C++入门 - priority-queue(STL)优先队列

    priority_queue 源码

    c++文档stl_src_doc

    通过"stl_src_doc"提供的HTML文档,你可以深入学习这些概念,了解它们的使用方法、性能特点以及如何根据具体需求选择合适的数据结构和算法。文档可能还包含示例代码、常见问题解答以及详细的API参考,帮助你更好地...

    C++ STL Adaptor stack、queue和vector的使用.doc

    C++ STL Adaptor stack、queue和vector的使用 C++ STL 提供了多种容器类,包括 stack、...以上就是 C++ STL 中 stack、queue 和 priority queue 的使用方法和常见操作。这些容器类可以方便地实现各种数据结构和算法。

    C++ STL程序员面试题

    理解并熟练使用STL是C++程序员必备的技能之一,它能帮助编写出高效、可读性强的代码。在面试中,对STL的深入理解不仅可以展示你的技术实力,还能表现出你对编程最佳实践的追求。因此,熟悉STL的各个部分并能够灵活...

    STL_quene.rar_crowd7oc_优先队列 堆_大根堆_大根对 c++_小根堆

    其中,优先队列(Priority Queue)是STL提供的一种数据结构,它是一种特殊的队列,遵循“最大优先”或“最小优先”的原则。在本案例中,我们将探讨如何使用STL来实现大根堆和小根堆,以及它们在优先队列中的应用。 ...

Global site tag (gtag.js) - Google Analytics