C++ STL priority_queue

转自:

priority_queue 优先级队列是一个拥有权值概念的单向队列queue,在这个队列中,所有元素是按优先级排列的(也可以认为queue是个按进入队列的先后做为优先级的优先队列——先进入队列的元素优先权要高于后进入队列的元素)。

在计算机操作系统中,优先级队列的使用是相当频繁的,进线程调度都会用到。

在STL的具体实现中,priority_queue也是以别的容器作为底部结构,再根据堆的处理规则来调整元素之间的位置。

模板声明:

priority_queue<Type, Container, Functional>   //含三个参数

Type 为数据类型,Container 为保存数据的容器,Functional 为元素比较方式

默认Container:vector     //Container 必须是用数组实现的容器,比如 vector, deque ;不能用 list
默认Function:operator<
所以若后面两个参数缺省的话,优先队列就是大顶堆

priority_queue 函数列表

priority_queue <Elem> c   //创建一个空的queue 。(注:priority_queue构造函数有7个版本)
c.top()       //返回队列头部数据
c.push(elem)  //在队列尾部增加elem数据
c.pop()       //队列头部数据出队
c.empty()     //判断队列是否为空
c.size()      //返回队列中数据的个数

1. 大顶堆 - 默认

#include <iostream>
#include <queue>
using namespace std;
int main(){
    priority_queue<int, vector<int>, less<int> >q1;  //使用priority_queue<int> q1;一样
    for(int i=0; i<10; i++)
	q1.push(i);
    while(!q1.empty()){
        cout << q1.top() << endl;
        q1.pop();
    }
    return 0;
}

2. 小顶堆 – greater<>

STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆

#include <iostream>
#include <queue>
using namespace std;
int main(){
    priority_queue<int, vector<int>, greater<int> >q2;
    for(int i=0; i<10; i++)
	q2.push(i);
    while(!q2.empty()){
        cout << q2.top() << endl;
        q2.pop();
    }
    return 0;
}

3. 自定义类型

- 法一:重载 operator<

自定义类型重载 operator< 后,声明对象时就可以只带一个模板参数.
此时不能像基本类型这样声明 priority_queue<Node, vector<Node>, greater<Node> >;
因为 greater<Node> 没有定义

#include <iostream>
#include <queue>
using namespace std;
struct Node{
    int x, y;
}node;
//重载>会编译出错,因为标准库默认使用元素类型的<操作符来确定它们之间的优先级关系
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++){
    	node.x=i;
    	node.y=10-i/2;
    	q.push(node);
    }
    while(!q.empty()){
        cout << q.top().x << ‘ ‘ << q.top().y << endl;
        q.pop();
    }
    return 0;
}
- 法二:自己写仿函数 cmp

仿函数(functor):使一个类的使用看上去像一个函数。其实现就是类中实现一个运算符函数operator(),这个类有了类似函数的行为,就是一个仿函数类了.

推广:set的自定义比较函数也可以写成这种形式

#include <iostream>
#include <queue>
using namespace std;
struct Node{
	int x, y;
}node;
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++){
    	node.x=i;
    	node.y=10-i/2;
	q.push(node);
    }
    while(!q.empty()){
        cout << q.top().x << ‘ ‘ << q.top().y << endl;
        q.pop();
    }
    return 0;
}
时间: 2024-08-06 15:58:51

C++ STL priority_queue的相关文章

STL - priority_queue(优先队列)

优先级队列priority_queue 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL priority_queue 用来开发一些特殊的应用. priority_queue<int, deque<int>> pq; priority_queue<int, vector<int>> pq; pq.empty() pq.size() pq.top() pq.pop() pq.push(item) demo #include <iostream

详解C++ STL priority_queue 容器

详解C++ STL priority_queue 容器 本篇随笔简单介绍一下\(C++STL\)中\(priority_queue\)容器的使用方法和常见的使用技巧. priority_queue容器的概念 \(priority_queue\)在英文中是优先队列的意思. 队列是一种基本的数据结构.其实现的基本示意图如下所示: 而\(C++STL\)中的优先队列就是在这个队列的基础上,把其中的元素加以排序.其内部实现是一个二叉堆.所以优先队列其实就是把堆模板化,将所有入队的元素排成具有单调性的一队

STL priority_queue 优先队列 小记

今天做题发现一个很有趣的地方,竟然还是头一次发现,唉,还是太菜了. 做图论用STL里的priority_queue去优化prim,由于特殊需求,我需要记录生成树中是用的哪些边. 于是,我定义的优先队列类型的数据结构如下: 1 struct node //优先队列存储结构,v存储节点号,e存储边号,dis[]为到该点的最短距离 2 { 3 int v,e; 4 node(){} 5 node(int _v,int _e):v(_v),e(_e){} 6 bool operator <(const

STL priority_queue

优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序 每次的push和pop操作,队列都会动态的调整,以达到我们预期的方式来存储. 例如:我们常用的操作就是对数据排序,优先队列默认的是数据大的优先级高 所以我们无论按照什么顺序push一堆数,最终在队列里总是top出最大的元素. 用法: 示例:将元素5,3,2,4,6依次push到优先队列中,print其输出. 1. 标准库默认使用元素类型的<操作符来确定它们之间的优先级关系. priority_qu

STL - priority_queue(优先队列)

参考:http://www.cnblogs.com/xzxl/p/7266404.html 一.基本定义: 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队.这点类似于给队列里的元素进行了由大到小的顺序排序.元素的比较规则默认按元素值由大到小排序,可以重载"<"操作符来重新定义比较规则. 优先级队列可以用向量(vector)或双向队列(deque)

STL学习系列七:优先级队列priority_queue容器

1.简介 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL priority_queue 用来开发一些特殊的应用,请对stl的类库,多做扩展性学习 如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了.这样,我们就引入了优先级队列 这种数据结构. 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一

STL之优先级队列priority_queue

摘要: priority_queue,自适应容器(即容器适配器):不能由list来组建: 最大值优先级队列(最大值始终在对首,push进去时候) 最小值优先级队列: 优先级队列适配器 STL  priority_queue priority_queue<int, deque<int> > pg; priority_queue<int, vector<int> > pg; STL中实现的方法: pg.empty(); pg.size(); pg.top();

c++中STL之heap, priority_queue使用

一.heap heap并不属于STL容器组件,它分为 max heap 和min heap,在缺省情况下,max-heap是优先队列(priority queue)的底层实现机制.而这个实现机制中的max-heap实际上是以一个vector表现的完全二叉树(complete binary tree).STL在<algorithm.h>中实现了对存储在vector/deque 中的元素进行堆操作的函数,包括make_heap, pop_heap, push_heap, sort_heap,对不愿

C++STL容器简析

标准STL序列容器:vector.string.deque和list.标准STL关联容器:set.multiset.map和multimap.非标准的关联容器hash_set.hase_multiset.hash_map和hash_multimap. (1)vector容器vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素.因此,