c++优先队列(priority_queue)用法详解

优先队列是queue的一种,#include<queue>。不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。

优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。

c++优先队列(priority_queue)用法详解

定义

priority_queue<Type, Container, Functional>

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

1.在STL中,默认情况下(不加后面两个参数)是以vector为容器,以 operator< 为比较方式,所以在只使用第一个参数时,优先队列默认是一个最大堆,每次输出的堆顶元素是此时堆中的最大元素。

2.用到最小堆,则一般要把模板的三个参数都带进去。

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

大顶堆与小顶堆

注意事项:如果使用lessgreater函数,需要头文件:#include <functional>

大顶堆(降序)
//构造一个空的优先队列(此优先队列默认为大顶堆)
priority_queue<int> big_heap;   

//另一种构建大顶堆的方法
priority_queue<int,vector<int>,less<int> > big_heap2;   
小顶堆(升序)
//构造一个空的优先队列,此优先队列是一个小顶堆
priority_queue<int,vector<int>,greater<int> > small_heap;  

成员函数

和队列基本操作相同

  • top 访问队头元素
  • empty 队列是否为空
  • size 返回队列内元素个数
  • push 插入元素到队尾 (并排序)
  • emplace 原地构造一个元素并插入队列
  • pop 弹出队头元素
  • swap 交换内容

示例

#include<iostream>
#include <queue>
using namespace std;
int main()
{
    //对于基础类型 默认是大顶堆
    priority_queue<int> a;
    //等同于 priority_queue<int, vector<int>, less<int> > a;

    //      这里一定要有空格,不然成了右移运算符↓↓
    priority_queue<int, vector<int>, greater<int> > c;  //这样就是小顶堆
    priority_queue<string> b;

    for (int i = 0; i < 5; i++)
    {
        a.push(i);
        c.push(i);
    }
    while (!a.empty())
    {
        cout << a.top() << ' ';
        a.pop();
    }
    cout << endl;

    while (!c.empty())
    {
        cout << c.top() << ' ';
        c.pop();
    }
    cout << endl;

    b.push("abc");
    b.push("abcd");
    b.push("cbd");
    while (!b.empty())
    {
        cout << b.top() << ' ';
        b.pop();
    }
    cout << endl;
    return 0;
}

原创文章,作者:三酷猫,如若转载,请注明出处:https://www.sankumao.com/392.html

(0)
上一篇 2022年4月18日 下午9:20
下一篇 2022年4月20日 下午7:39

相关推荐

  • make makefile cmake qmake都是什么,有什么区别

    gcc 是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortr…

    2022年12月30日
  • Vs2022配置QT5.14.2详细教程!

    为什么用VS写Qt程序 很多人在Qt上写代码时,感觉不是很舒服,所以想在Vs上写Qt程序,而且Vs具有强大的调试能力,所以咱们可以通过一些配置实现此目的。 Vscode和Qt没安装…

    2022年12月29日
  • Qt的编译方式:qmake/cmake/qbs的区别以及如何选择

    在使用Qt Creator创建项目时,选择构建工具时,有三个选择:Qmake、Cmake以及Qbs。那么这三者有什么区别呢?我们又该如何选择? 先说结论 Qbs将被官方废弃 Qt6…

    2022年12月30日
  • 使用Qt Creator创建项目

    1.打开Qt Creator 界面选择 New Project或者选择菜单栏 【文件】-【新建文件或项目】菜单项 2.弹出New Project对话框,选择Qt Widgets A…

    2023年1月4日
  • vs是什么?Visual Studio如何安装?

    Vs是高度集成的编程环境,使用简单,无需复杂的配置和调试,写c/c++建议使用vs! 一、下载 官网地址:https://visualstudio.microsoft.com/zh…

    2022年12月29日
  • Qt的命名规范和常用快捷键

    一、命名规范 1.类名:大驼峰 MyClass,QPushButton class MainWindow 2.Qt中内置的类型,头文件和类命名同名。 #include <QS…

    2023年1月5日
  • c++ pair用法详解

    今天在刷力扣时,遇到一道题: 原题链接:https://leetcode-cn.com/problems/first-unique-character-in-a-string/ 我…

    2022年4月25日
  • c++ void无返回函数要不要加return?有什么作用?

    return语句是函数中一个重要的语句,return语句用于结束当前正在执行的函数,并将控制权返回给调用此函数的函数。同时也可以返回一个参数。 return语句有两种形式:retu…

    2022年4月25日
  • 一个最简单的Qt应用程序(Qt基础文件解析)

    根据上文的《使用Qt Creator创建项目》,我们创建了一个最简单的QT项目。生成的文件内容如下,本文将带大家解析一下这些文件。 一、main.cpp 解析: Qt一个类对应一个…

    2023年1月5日
  • Qt 5.14.2超详细安装教程,不会来打我~

    Qt简介 Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C++ 开库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序。Q…

    2022年12月29日

发表评论

您的电子邮箱地址不会被公开。