C++ STL之priority_queue

STL中的priority_queue(优先队列)是一种会按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序的容器,不同优先级的情况下,top()上永远是最高优先级的数据,其底层采用的是堆结构(默认大顶堆)。注意相同优先级下并没有先进先出,后面的例子中可以看到

头文件#include<queue>

标准库默认使用元素类型的<操作符来确定它们之间的优先级关系,数据越大优先级越高,想要改变优先级的界定方式的话需要重载<操作符。

先看个最简单的:

#include<iostream>
#include<queue>
using namespace std;

int main()
{
    priority_queue<int>pq;
    pq.push(5);
    pq.push(4);
    pq.push(3);
    pq.push(4);
    pq.push(8);
    pq.push(2);
    while(!pq.empty())
    {
        cout<<pq.top()<<endl;
        pq.pop();
    }
    return 0;
}

运行结果:

下面再看一个例子:

#include<iostream>
#include<queue>
using namespace std;
struct node
{
    int value;
    int pro;
    friend bool operator <(node n1,node n2)//自定义priority_queue结构中优先级的界定方式
    {
        return n1.pro<n2.pro;
    }
};
int main()
{
    priority_queue<node>pq;
    node temp;

    temp.pro=5;
    temp.value=10;
    pq.push(temp);

    temp.pro=4;
    temp.value=11;
    pq.push(temp);

    temp.pro=3;
    temp.value=7;
    pq.push(temp);

    temp.pro=4;
    temp.value=9;
    pq.push(temp);

    temp.pro=6;
    temp.value=9;
    pq.push(temp);

    temp.pro=4;
    temp.value=5;
    pq.push(temp);

    while(!pq.empty())
    {
        cout<<pq.top().pro<<" "<<pq.top().value<<endl;
        pq.pop();
    }
    return 0;
}

结果:

从这个例子中可以看到,对于相同优先级的三个pro值为4的结构体,输入顺序中value值依次为11,9,5,而输出确实5,11,9,所以相同优先级的情况下并没有先进先出。

如果想把底层改成小顶堆结构,需要重载<就可以了,如下面的例子:

#include<iostream>
#include<queue>
using namespace std;
struct node
{
    int value;
    int pro;
    friend bool operator <(node n1,node n2)//自定义priority_queue结构中优先级的界定方式
    {
        return n1.pro>n2.pro;
    }
};
int main()
{
    priority_queue<node>pq;
    node temp;

    temp.pro=5;
    temp.value=10;
    pq.push(temp);

    temp.pro=4;
    temp.value=11;
    pq.push(temp);

    temp.pro=3;
    temp.value=7;
    pq.push(temp);

    temp.pro=4;
    temp.value=9;
    pq.push(temp);

    temp.pro=6;
    temp.value=9;
    pq.push(temp);

    temp.pro=4;
    temp.value=5;
    pq.push(temp);

    while(!pq.empty())
    {
        cout<<pq.top().pro<<" "<<pq.top().value<<endl;
        pq.pop();
    }
    return 0;
}

结果如下:

最后吐槽一下,priority_queue为什么会是一种queue呢?从它上面我根本没看到队列先进先出的特点。

时间: 2024-10-06 01:43:17

C++ STL之priority_queue的相关文章

STL之priority_queue(优先队列)

priority_queue是一个容器适配器,在这个容器里第一个数据元素是最大的.它的使用场景是什么样:如果12306抢票,为什么黄牛能抢这么多票,感觉12306那边的请求队列是一个优先队列,黄牛的请求携带了一个隐含参数,所以他的请求最先执行.当然这是怀疑.不过也是优先级队列的使用场景.还可以进行排序,把数据压入优先队列中,然后出队列就是由大到小排列了 注意:stl的priority_queue容器需要一个boolean operator<(const T& ,const T&)函数

STL学习——Priority_queue篇

STL学习--Priority_queue篇 概述 priority_queue是一个拥有权值观念的queue,它允许加入新元素,移除旧元素,审视元素值等功能.因为它是queue,故只允许底端加入元素,顶端取出元素.priorit_queue内元素并非依照被推入的次序排列,而是依照元素权值排列.权值最高者,排在最前面. 实现 priority_queue利用max_heap和vector表现的完全二叉树实现.它的实现完全以底部容器为根据,并使用heap处理规则,故实现简单.默认情况,使用vect

STL之priority_queue的用法

priority_queue的用法:这里先将一下STL里面的heap(堆),再来将如何使用heap来实现优先队列 在STL里面: 下面介绍STL中与堆相关的4个函数--建立堆make_heap(),在堆中添加数据push_heap(),在堆中删除数据pop_heap()和堆排序sort_heap(): 头文件 #include <algorithm> 下面的_First与_Last为可以随机访问的迭代器(指针),_Comp为比较函数(仿函数),其规则--如果函数的第一个参数小于第二个参数应返回

STL之priority_queue

描述 使用STL中的优先队列,将一个字符串中的各个字符按照ASCII从大到小顺序排列. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. int main() { priority_queue<char> qu; int n; cin>>n; while(n--) { Input(qu); while(!qu.empty()) { cout<<qu.top(); qu.pop(); } cout<<endl; } return 0; } 输入 输

STL之priority_queue为复合结构排序

priority_queue为复合结构排序: 1 #include <iostream> 2 #include <queue> 3 4 using namespace std; 5 struct Node{ 6 int x; 7 string y; 8 Node( int a= 0, string b = "" ): 9 x(a), y(b) {} 10 }; 11 bool operator<( Node a, Node b ){ // 注意这里的顺序和

STL容器 -- Priority_Queue

核心:和队列相似,但优先队列中的 “下一个元素” 指的是 “优先级最高” 的元素. 头文件:#include<queue> 普通类型的构造方法: priority_queue<int> maxQu; //构造一个包含 int 型元素的优先队列,默认优先级为 int 元素的值越大则优先级越高 priority_queue< int, vector<int>, greater<int> > minQu; //构造一个包含 int 型元素的优先队列,优

【STL】priority_queue 的自定义排序

重载 operator< 或者自己写仿函数: 1 typedef struct{ 2 string name; 3 int rp; 4 }node; 5 6 bool operator <( node x, node y ){ 7 if(x.rp>y.rp) return 1; 8 else if(x.rp==y.rp && x.name<y.name) return 1; 9 return 0; 10 } 11 12 priority_queue <node

优先队列 c++ STL之 priority_queue

优先队列 基本操作: empty pop push size top 默认:从大到小排序:priority_queue<int>q 从小到大:priority_queue<int,vector<int>,greater<int>>q 原文地址:https://www.cnblogs.com/Frank-King/p/9931554.html

【STL】优先队列priority_queue详解+OpenJudge-4980拯救行动

一.关于优先队列 队列(queue)这种东西广大OIer应该都不陌生,或者说,队列都不会你还学个卵啊(╯‵□′)╯︵┻━┻咳咳,通俗讲,队列是一种只允许从前端(队头)删除元素.从后端(队尾)插入元素的数据结构.而优先队列(priority queue)是一种赋予每个队列中元素以一个优先级的队列.在执行删除操作时,优先队列会删除具有最高优先级的元素.如此奇妙的优先队列有什么用呢,举个例子,给定一个长为n的序列和m组询问,对于每组询问,我们要找出删去序列中最小的数,再向序列加入一个数.朴素的想法是对