STL—priority_queue

简介: priority_queue又称为优先队列,其底层是用堆来实现的,优先队列中,队首元素一定是当前队列中优先级最高的哪一个,我们可以在任何时候往队列里插入(push)元素,其优先队列内部会随时做出自我调整,使得每次的队首元素都是优先级最大的,这里的优先级我们可以自己规定,比如规定数字越小优先级越大等等,下文会做出讲解.

文章目录

一、什么是priority_queue

二、priority_queue的操作

1.priority_queue的定义

2.priority_queue容器内元素的访问

3.priority_queue中的函数

(1)push()

(2)top()

(3)pop()

(4)empty()

(5)size()

4.priority_queue内元素优先级的设置

基本数据结构类型的优先级设置

结构体的优先级设置


一、什么是priority_queue

priority_queue又称为优先队列,其底层是用堆来实现的,优先队列中,队首元素一定是当前队列中优先级最高的哪一个,我们可以在任何时候往队列里插入(push)元素,其优先队列内部会随时做出自我调整,使得每次的队首元素都是优先级最大的,这里的优先级我们可以自己规定,比如规定数字越小优先级越大等等,下文会做出讲解.


要使用优先队列,需要添加头文件#include <queue>


二、priority_queue的操作

1.priority_queue的定义

priority_queue<typename> name;


其定义方法和其他的STL容器相同,typename可以是任意基本数据结构或者容器


2.priority_queue容器内元素的访问

和队列不同,优先队列没有front(),back()函数,只能通过top()去访问队首元素(堆顶元素),即优先级最高的元素,q.push(x);是把x插入到队列中

#include <iostream>
#include <queue>
using namespace std;
int main()
{
    priority_queue<int> q;
    q.push(5);
    q.push(7);
    q.push(1);
    cout << q.top();
    return 0;
}

输出结果为:7


3.priority_queue中的函数

(1)push()

q.push(x);令x入队,时间复杂度为O(logN),N为当前优先队列中的元素个数,实例见priority_queue容器内元素的访问


(2)top()

q.top();可以获得队首元素(堆顶元素),时间复杂度为O(1),实例见priority_queue容器内元素的访问


(3)pop()

q.pop();令队首元素(堆顶元素)出队,时间复杂度为O(logN),N为当前优先队列中的元素个数

#include <iostream>
#include <queue>
using namespace std;
int main()
{
    priority_queue<int> q;
    q.push(5);
    q.push(7);
    q.push(1);
    cout << q.top() << endl;
    q.pop();
    cout << q.top();
    return 0;
}

输出结果为:

7

5

(4)empty()

q.empty();用来检测队列是否为空,返回true为空,返回false则非空,时间复杂度为O(1)

#include <iostream>
#include <queue>
using namespace std;
int main()
{
    priority_queue<int> q;
    if(q.empty()) cout << "EMPTY" << endl;
    else cout << "NOT EMPTY" << endl;
    for (int i = 1; i <= 5; i ++ ) q.push(i);
    if(q.empty()) cout << "EMPTY" << endl;
    else cout << "NOT EMPTY" << endl;
    return 0;
}

输出结果为:

EMPTY

NOT EMPYTY

(5)size()

q.size();返回优先队列内的元素个数,时间复杂度为O(1)

#include <iostream>
#include <queue>
using namespace std;
int main()
{
    priority_queue<int> q;
    q.push(5);
    q.push(7);
    q.push(1);
    cout << q.size();
    return 0;
}

输出结果为:3

4.priority_queue内元素优先级的设置

基本数据结构类型的优先级设置

我们知道,优先队列都是默认把字典序(数字)大的放到队首(堆顶),如果我们想要把最小的元素放在队首的话,可以如下定义:

priority_queue<int, vector<int>, greater<int>> q;     //把最小的元素放在堆顶的定义方法
priority_queue<char, vector<char>, greater<char>> q;  //把字典序最小的元素放在堆顶的定义方法
//上述两式如果报错的话可以写成:
priority_queue<int, vector<int>, greater<int> > q; 
priority_queue<char, vector<char>, greater<char> > q;

下面是一个例子:

#include <iostream>
#include <queue>
using namespace std;
int main()
{
    priority_queue<char, vector<char>, greater<char>> q;
    q.push('c');
    q.push('a');
    q.push('d');
    cout << q.top();
    return 0;
}

输出结果为:a


结构体的优先级设置

在这里首先强调一下如果用结构体 + 优先队列对结构体进行内部排序的效果和sort + 结构体的作用效果是相反的,即我们如果按照下述例子比如按照区间的左顶点从小到大进行排序的模板写到sort排序中,那么就是按照区间的左顶点从大到小进行排序,这里读者只需要明确这一点就好了,本章介绍的是结构体 + 优先队列,对sort不进行讲解,sort函数的讲解见博客:STL—algorithm(2)


我们这里举一个区间的例子,比如我们对区间的左顶点和右定点建立一个结构体

struct Range
{
    int l, r;
}range[N];

现在我们希望我们按照区间的左顶点从小到大进行排序,则写成:

struct Range
{
    int l, r;
    bool operator < (const Range w) const
    {
        return l > w.l;
    }
}range[N];

如果我们希望我们按照区间的左顶点从大到小进行排序,则写成:

struct Range
{
    int l, r;
    bool operator < (const Range w) const
    {
        return l < w.l;
    }
}range[N];

举一个例子:现在给三个水果的名字和价格,要求按照水果价格从高到低进行排序

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
struct fruit{
    string n;
    int p;
    bool operator < (const fruit w) const
    {
        return p < w.p;
    }
}f[3];
int main()
{
    priority_queue<fruit> q;
    f[0].n = "桃子";
    f[0].p = 2;
    f[1].n = "梨";
    f[1].p = 4;
    f[2].n = "苹果";
    f[2].p = 1;
    for (int i = 0; i < 3; i ++ ) q.push(f[i]);
    auto t = q.top();
    cout << t.n << ' ' << t.p;
    return 0;
}

输出结果:梨 4

现在给三个水果的名字和价格,要求按照水果价格从低到高进行排序

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
struct fruit{
    string n;
    int p;
    bool operator < (const fruit w) const
    {
        return p > w.p;
    }
}f[3];
int main()
{
    priority_queue<fruit> q;
    f[0].n = "桃子";
    f[0].p = 2;
    f[1].n = "梨";
    f[1].p = 4;
    f[2].n = "苹果";
    f[2].p = 1;
    for (int i = 0; i < 3; i ++ ) q.push(f[i]);
    auto t = q.top();
    cout << t.n << ' ' << t.p;
    return 0;
}

输出结果:苹果 1




目录
相关文章
|
4天前
|
云安全 人工智能 算法
以“AI对抗AI”,阿里云验证码进入2.0时代
三层立体防护,用大模型打赢人机攻防战
1315 4
|
4天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
660 3
|
5天前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
|
11天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
766 6
|
8天前
|
物联网 API UED
Qwen-Image-Edit-2511来啦!角色一致性再提升,LoRA能力内置
Qwen-Image-Edit-2511发布!提升角色与多人合照一致性,集成Lora打光、新视角生成,增强工业设计与几何推理能力。已开源,支持魔搭、QwenChat免费体验,本地部署可获最佳效果。
465 3