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
相关推荐
下面,我们将详细介绍 priority_queue 的使用方法和实现原理。 priority_queue 的基本概念 priority_queue 是一种特殊的队列,它可以自动对元素进行排序,使得队列中最大的元素总是位于队首。这种特性使得 ...
- 迭代器的使用方法,包括递增、递减、比较和解引用。 - 算法的使用,如如何使用sort对容器排序,或使用find查找特定元素。 - 特殊容器如stack(栈)、queue(队列)和priority_queue(优先队列)的使用场景和操作...
从提供的文件内容来看,文档标题为"priority_queue.pdf",描述同样为"priority_queue.pdf",说明该文档是关于优先队列(priority queue)的,它是C++标准模板库(STL)中的一个重要容器。由于文档内容是以OCR扫描...
在C++ STL中,`<queue>`头文件提供了`priority_queue`类模板,用于实现这个数据结构。它通常与堆排序算法相关联,因为内部结构通常是二叉堆。 2. **mapA和mapB**:`map`是STL中的一种关联容器,它存储键值对,每个...
"STL C++ experience gas841 C++STL"这些标签反映了本书内容的核心,包括STL、C++实战经验以及对STL库的深入探讨。 STL是C++标准库中的一个重要部分,它包括了容器(如vector、list、set等)、迭代器、算法和函数...
优先队列(Priority Queue)是STL提供的一种特殊容器,它遵循“最大优先”或“最小优先”的原则,每次删除或获取的元素总是最大或最小的一个。C++中的`std::priority_queue`类实现了这个功能,你可以指定元素的比较...
本文详细介绍了C++ STL中的`stack`、`queue`和`priority_queue`的使用方法。通过这些容器,可以有效地处理各种数据结构问题,如逆波兰表达式求值、括号匹配、任务调度等。掌握这些容器的使用不仅能够提高编程效率,...
在C++标准模板库(STL)中,提供了`<queue>`头文件内的`priority_queue`容器,它封装了上述操作。用户可以自定义比较函数对象以实现最大堆或最小堆,并可以方便地进行插入、删除和查看操作。 **四、实现方式** 1. *...
6. 适配器:如stack、queue、priority_queue,它们将基础容器包装成特定的行为模式,如后进先出(LIFO)的栈、先进先出(FIFO)的队列和优先级队列。 在"C++API.chm"文件中,你可以找到关于这些组件的详细说明,...
在C++中,`priority_queue`是STL(Standard Template Library)的一部分,提供了对优先队列的支持。然而,自定义优先队列可以提供更多的灵活性,比如在上述代码中,我们看到了一个基于最大堆实现的自定义优先队列。 ...
### C++ STL (Standard Template Library) 知识点解析 #### 一、C++ STL 概述 在《C++ STL标准模板库》这本书中,作者 Ulrich Breymann 详细介绍了 C++ Standard Template Library(简称 STL)的概念、设计原理...
C++STL详解 C++STL 库是 C++ 语言中非常重要的一部分,它提供了许多有用的容器、算法和迭代器,帮助开发者更方便地编写高效、可重用的代码。 泛型程序设计是 C++ 语言中非常重要的一部分,它允许开发者编写通用的...
提到的"STL的入门ppt"很可能是介绍这些概念的教程资料,对于初学者来说,这是一个很好的起点,可以帮助理解STL的基本原理和使用方法。 通过深入学习和实践STL,C++程序员可以写出更高效、更易于维护的代码,同时...
5. **适配器**:适配器是一种设计模式,STL中有两种主要类型的适配器:容器适配器(如stack、queue和priority_queue)和迭代器适配器。它们可以将现有的容器或迭代器转换为其他形式,以满足特定需求。 6. **内存...
priority_queue 源码
通过"stl_src_doc"提供的HTML文档,你可以深入学习这些概念,了解它们的使用方法、性能特点以及如何根据具体需求选择合适的数据结构和算法。文档可能还包含示例代码、常见问题解答以及详细的API参考,帮助你更好地...
C++ STL Adaptor stack、queue和vector的使用 C++ STL 提供了多种容器类,包括 stack、...以上就是 C++ STL 中 stack、queue 和 priority queue 的使用方法和常见操作。这些容器类可以方便地实现各种数据结构和算法。
理解并熟练使用STL是C++程序员必备的技能之一,它能帮助编写出高效、可读性强的代码。在面试中,对STL的深入理解不仅可以展示你的技术实力,还能表现出你对编程最佳实践的追求。因此,熟悉STL的各个部分并能够灵活...
其中,优先队列(Priority Queue)是STL提供的一种数据结构,它是一种特殊的队列,遵循“最大优先”或“最小优先”的原则。在本案例中,我们将探讨如何使用STL来实现大根堆和小根堆,以及它们在优先队列中的应用。 ...
- **优先级队列**:C++中`priority_queue`可以用来实现优先级高的元素先出。 - **广度优先搜索(BFS)**:在图论中,BFS遍历图的节点时使用队列。 - **循环队列**:避免数组队列满或空的问题,通过模运算实现队首队尾...