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




目录
相关文章
|
3月前
|
容器
STL_queue
STL_queue
17 1
|
8月前
|
存储 算法 C++
C++ STL priority_queue
优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。
|
6月前
|
算法 Serverless C++
【C++】STL使用仿函数控制优先级队列priority_queue
【C++】STL使用仿函数控制优先级队列priority_queue
|
6月前
|
存储 算法 C++
『C++ - STL』之优先级队列( priority_queue )
『C++ - STL』之优先级队列( priority_queue )
|
6月前
|
存储 算法 程序员
stack、queue、priority_queue的使用和简单实现【STL】
stack、queue、priority_queue的使用和简单实现【STL】
26 0
|
7月前
|
设计模式 算法 C语言
C++实践模拟(stack,queue & priority_queue,仿函数)
C++实践模拟(stack,queue & priority_queue,仿函数)
38 0
|
10月前
|
存储 算法 C++
C++【STL】之priority_queue学习
C++ STL 优先级队列,常用接口的使用和模拟实现详细讲解,干货满满!
68 1
C++【STL】之priority_queue学习
|
11月前
|
算法 容器
stack_queue | priority_queue | 仿函数
stack_queue | priority_queue | 仿函数
80 0
|
11月前
|
存储 设计模式 算法
【STL】stack、queue、priority_queue模拟实现
一. deque简单介绍 1.1 deque的功能介绍 deque(双端队列
|
存储 算法 C++
【C++要笑着学】STL stack&queue | 优先级队列 priority_queue | 双端队列 deque
学完 stack 和 queue 后,以后我们再需要用栈和队列的地方我们就不用自己去实现了,直接用就行。它们是通过容器适配器去实现的,本章我们先去学习如何去使用它们。此外我们还要讲解优先级队列 priority_queue 和双端队列 deque,deque 我们下一章实现 stack 和 queue 的时候会用到,所以放在这一章先讲解一下,至于 deque 涉及到的 "仿函数" 概念我们会再下一章讲实现的时候重点讲解!
114 0
【C++要笑着学】STL stack&queue | 优先级队列 priority_queue | 双端队列 deque