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大的元素。

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

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

相关文章

  • Android安卓5.0系统正式版刷机包(镜像)官方下载地址汇总(适配设备)

    Android安卓5.0系统正式版刷机包(镜像)官方下载地址汇总(适配设备)攻略 1. 准备工作 在开始刷机之前,确保你已经完成以下准备工作:- 一台适配Android 5.0系统的设备(例如:手机、平板等)- 电脑,并确保已经安装了ADB工具和相应的驱动程序- USB数据线- 备份你的设备数据,因为刷机会清除所有数据 2. 下载刷机包 在这里,我们提供了A…

    other 2023年8月4日
    00
  • 魔兽世界7.3冰法圣物搭配 wow7.3冰法最佳圣物特质选择优先级介绍

    魔兽世界7.3 冰法圣物搭配攻略 冰法圣物的概述 冰法职业的圣物是与炎法和奥法所不同的,它的圣物比较多,个别的圣物也更为重要。 冰法使用过圣物后,会有极高的暴击等属性,使得暴击率与暴击伤害增加的数值极高,同时会提高法力上限和回复。 圣物可以让你的角色在战斗中更持久且输出更高。 冰法圣物的选择 冰法职业的圣物包含了以下属性: 灌魔 卓越 主炮 寒霜 黑暗 生命…

    other 2023年6月27日
    00
  • windows gtk+开发环境搭建方法详解(图解)

    以下是完整的“Windows GTK+开发环境搭建方法详解(图解)”攻略。 1. 下载安装包 首先,我们需要下载Windows版本的GTK+开发包和Glade GUI可视化设计工具。可以在 https://www.gtk.org下载。 2. 安装GTK+ 安装包下载完成后,双击运行并按照提示进行安装。安装过程中需要注意以下两点: 首先,要选择“Custom”…

    other 2023年6月27日
    00
  • Vue实现登录记住账号密码功能的思路与过程

    下面我将详细讲解Vue实现登录记住账号密码功能的思路与过程: 思路 首先需要在登录页面添加复选框选项,用于用户选择是否记住账号密码; 用户选中复选框后,将用户输入的账号密码存储到本地存储中; 页面加载时从本地存储中读取账号密码,并自动填充到输入框中,如果用户未选择记住账号密码,则不进行自动填充; 当用户点击登录按钮时,先判断是否选择了记住账号密码,如果是则将…

    other 2023年6月27日
    00
  • eShopOnContainers 知多少[1]:总体概览

    eShopOnContainers 知多少[1]: 总体概览 什么是 eShopOnContainers? eShopOnContainers是一个基于微服务架构的电子商务应用程序。它是由.NET Foundation开发并开源的。该应用程序提供了完整的源代码以及实现微服务架构的最佳实践,是学习微服务架构设计模式和实现的优秀案例。它还提供了许多开箱即用的功能…

    其他 2023年3月28日
    00
  • vnote:一个舒适的markdown笔记软件

    vnote:一个舒适的markdown笔记软件 在写作、笔记、博客排版等场景中,Markdown已越来越受欢迎。但是,纯粹的Markdown编辑器还是过于简单了些,不够智能、方便、美观。这时候,一款好用的Markdown笔记软件就尤为重要。 今天,我要介绍一款非常好用的Markdown笔记软件——vnote。 安装 vnote支持Windows、MacOS和…

    其他 2023年3月28日
    00
  • 局域网内“ip地址与网络上的其他系统有冲突”的两种解决方法

    解决局域网内IP地址与网络上其他系统冲突的方法 当局域网内的IP地址与网络上其他系统发生冲突时,我们可以采取以下两种解决方法: 方法一:更改冲突的IP地址 首先,需要确定哪些系统的IP地址发生了冲突。可以通过检查网络设备的日志或使用网络扫描工具来发现冲突的IP地址。 一旦确定了冲突的IP地址,需要找到一个未被使用的IP地址来替换它。可以使用IP地址管理工具或…

    other 2023年7月30日
    00
  • pytorch中文文档:torchstd

    以下是关于“PyTorch中文文档:torch.std”的完整攻略,包括torch.std的基本知识、使用方法和两个示例等。 torch的基本知识 torch.std是Torch中的一个函数,用于计算张量的标准差。标准差是一种衡量数据分散程度的统计量,它表示数据集合中各数据与平均数的差的平方的平均数的平方根。 torch.std的使用方法 可以使用torch…

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部