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

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

什么是优先队列

优先队列是一种抽象的数据结构,它有点类似与一般的队列,但是又有一些特殊之处。在一个一般的队列中,元素是按照时间顺序排列的。而在优先队列中,元素是按照优先级排列的。也就是说,队头元素是最小或最大的元素。

在C++中,我们可以使用priority_queue来构建优先队列。

优先队列的使用

构建优先队列

在使用优先队列前,需要包含头文件<queue>。构建一个最大值优先的整数优先队列,可以使用如下方式:

#include <queue>
using namespace std;

priority_queue<int> q;

最大值优先的意思是,队头元素为最大值。如果需要构建最小值优先的整数优先队列,则可以按照如下方式构建:

priority_queue<int, vector<int>, greater<int> > q;

元素插入

向优先队列中插入元素时,队列会根据优先级重新排列元素的位置,确保队头元素为最小值或最大值。

q.push(1);
q.push(3);
q.push(2);

在上述代码中,队列中的元素为123。队头元素为3,因为3是最大值。

元素访问

访问队头元素可以使用top函数。

int top_element = q.top();

在上述代码中,top_element的值将会被赋值为3

元素弹出

弹出队头元素时,队列会根据优先级重新排列元素的位置,确保队头元素为下一个最小值或最大值。

q.pop();

在上述代码中,队头元素3被弹出。队列中剩余元素为12

总结

在C++中使用优先队列时,需要引入头文件<queue>。使用priority_queue构建优先队列时,需要指定元素类型和优先级比较方式。push函数用于元素插入,top函数用于访问队头元素,pop函数用于弹出队头元素。

示例说明

示例1

以下代码展示了如何使用优先队列计算一组数的中位数。

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

int main()
{
    priority_queue<int> max_pq;
    priority_queue<int, vector<int>, greater<int> > min_pq;
    int n;
    cin >> n;
    while (n--)
    {
        int num;
        cin >> num;
        if (max_pq.size() == 0 || num <= max_pq.top())
            max_pq.push(num);
        else
            min_pq.push(num);
        if (max_pq.size() < min_pq.size())
        {
            int tmp = min_pq.top();
            min_pq.pop();
            max_pq.push(tmp);
        }
        else if (max_pq.size() - min_pq.size() == 2)
        {
            int tmp = max_pq.top();
            max_pq.pop();
            min_pq.push(tmp);
        }
        if (max_pq.size() > min_pq.size())
            cout << max_pq.top() << endl;
        else
            cout << (max_pq.top() + min_pq.top()) / 2 << endl;
    }
    return 0;
}

该程序中定义了一个最大值优先的整数优先队列max_pq和一个最小值优先的整数优先队列min_pq。程序采取了将数据流平均分成两部分的策略,保证优先队列中的元素始终是可以表示数据流上一半的中位数的。

示例2

以下代码展示了如何使用优先队列计算一个无序数组中的第k大元素。

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

int main()
{
    vector<int> nums{3, 2, 1, 5, 6, 4};
    int k = 2;
    priority_queue<int, vector<int>, greater<int> > pq;
    for (int i = 0; i < nums.size(); ++i)
    {
        pq.push(nums[i]);
        if (pq.size() > k)
            pq.pop();
    }
    cout << pq.top() << endl;
    return 0;
}

该程序中定义了一个最小值优先的整数优先队列pq,遍历一次数组后,队列中的元素即为前k大的元素,队头元素即为第k大的元素。

阅读剩余 66%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++优先队列(priority_queue)用法详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 2020五一劳动节放假时间安排5月1日放假调休时间表

    2020五一劳动节放假时间安排5月1日放假调休时间表 根据国务院办公厅发布的《2020年部分节假日安排的通知》,2020年五一劳动节假时间排如下: 放假时间:2020年5月1日至5月5日,共5天。 调休时间:2020年426日(星期日)和5月9日(星期六)上班。 以下是五一劳动节放假时间安排的完整攻略 定义 五一劳动节是中国的法定节之一,旨在表彰劳动人民的贡…

    other 2023年5月9日
    00
  • 使用Go module和GoLand初始化一个Go项目的方法

    当我们开始一个新的Go项目时,使用Go Module来管理依赖关系是一个很好的选择。Go Module帮助我们自动化地下载和管理项目中所需的包。 在GoLand中使用Go Module来初始化一个新项目有以下几个步骤: 步骤1:创建一个新的空白项目 在GoLand中,打开“File”菜单,选择“New Project”选项。在弹出的窗口中,选择“Empty …

    other 2023年6月20日
    00
  • 详解CentOS7 安装 MariaDB 10.2.4的方法

    下面是详解CentOS7安装MariaDB 10.2.4的方法的完整攻略: 安装 MariaDB 1. 添加 MariaDB Repository vi /etc/yum.repos.d/MariaDB.repo 然后将以下内容粘贴到文件中: [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/…

    other 2023年6月27日
    00
  • android 之Spinner下拉菜单实现级联

    Android之Spinner下拉菜单实现级联攻略 在Android开发中,Spinner是一种常用的下拉菜单控件。实现级联的Spinner可以根据前一个Spinner的选择,动态改变后一个Spinner的选项。下面是实现级联Spinner的完整攻略。 步骤一:准备数据源 首先,我们需要准备两个Spinner的数据源。假设我们要实现一个级联选择省份和城市的功…

    other 2023年9月7日
    00
  • npm run dev失败的简单解决办法

    解决 \”npm run dev\” 失败的简单方法攻略 当你运行 npm run dev 命令时,如果出现错误,可能是由于多种原因引起的。下面是一些常见的问题和解决方法,希望能帮助你解决问题。 1. 检查依赖项 首先,确保你的项目的依赖项已经正确安装。你可以运行以下命令来安装依赖项: npm install 如果依赖项已经安装,你可以尝试删除 node_m…

    other 2023年8月3日
    00
  • pybot详解

    以下是关于“Pybot详解”的完整攻略,过程中包含两个示例。 背景 Pybot是Robot Framework的Python实现,它是一个自动化测试架,可以用于测试Web应用程序、API、桌面应用程序等。Pybot提供了许多有用的功能,如测试套件、用例、关键字、变量等。本攻略将介绍如何使用Pybot进行自动化测试。 基本原理 在Pybot,我们可以使用Rob…

    other 2023年5月9日
    00
  • ps怎么初始化设置? ps切图设置的详细教程

    PS即Photoshop,是一款常用的图像处理软件。在使用PS进行图像处理的时候,初始化设置和切图设置是非常重要的。下面是PS初始化设置和切图设置的详细攻略。 PS初始化设置 步骤一:打开Photoshop 点击开始菜单或Dock栏中的Photoshop图标来打开Photoshop。 步骤二:选择新建文件 在Photoshop中选择“文件” > “新建…

    other 2023年6月20日
    00
  • 3d画廊

    3D画廊——在你的网站上展示3D艺术的最佳方式 艺术品的展示不仅取决于艺术家的作品,还取决于如何有效地将作品呈现给观众。通过在你的网站上展示3D艺术,你可以为你的访问者提供独特的视觉体验,同时向他们展示你的个人技能。下面是我们精心挑选并呈现的几种展示3D艺术的方式。 1. Three.js Three.js 是一个基于 WebGL 的 JavaScript …

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部