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日

相关文章

  • vue实现计算器封装

    下面是“vue实现计算器封装”的完整攻略: 1. 创建计算器组件 首先,我们需要创建一个计算器组件。可以使用 Vue CLI 创建一个基础的 Vue 单文件组件。具体命令如下: vue create calculator 在 src/components 目录下创建一个 Calculator.vue 文件。在该文件中,我们需要编写计算器组件的 HTML 和 …

    other 2023年6月25日
    00
  • 关于工伤事故索赔计算很好用的一款APP

    关于工伤事故索赔计算很好用的一款APP的完整攻略 工伤事故索赔计算是一项繁琐的工作,需要考虑多种因素,如伤残程度、工龄、工资等。为了方便工伤事故索赔的计算,有一款很好用的APP可以帮助我们完成这项工作。本文将为您提供一份详细的关于工伤事故索赔计算很好用的一款APP的完整攻略,包括APP的基本介绍、使用方法和两个示例说明。 APP的基本介绍 这款APP是一款专…

    other 2023年5月5日
    00
  • rabbitmq简单的消息发送与接收

    RabbitMQ简单的消息发送与接收攻略 RabbitMQ是一种流行的消息队列系统,它可以用于分布式系统中的消息传递和异步任务处理。本文将提供一个完整攻略,介绍RabbitMQ的简单消息发送与接收,并提供两个示例说明。 RabbitMQ的安装配置 在使用RabbitMQ之前,需要先安装和配置RabbitMQ。具体步骤如下: 步骤1:安装RabbitMQ 在官…

    other 2023年5月8日
    00
  • 关于.net的c#:32位块密码

    以下是关于“.NET的C#:32位块密码”的完整攻略,包含两个示例。 关于.NET的C#:32位块密码 在.NET的C#中我们可以使用System.Security.Cryptography命名空间中的类来实现32位块密码。以下是关于如何实现32位块密码的详细攻略。 1. 实现32位块密码 在.NET的C#中,我们可以使用AesManaged类来实现32位块…

    other 2023年5月9日
    00
  • elasticsearch中国

    当然,我很乐意为您提供有关“elasticsearch中国”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是elasticsearch中国? elasticsearch中国是elasticsearch在中国的官方网站,提供了elasticsearch的中文文档、社区、培训、咨询等服务。elasticsearch是一个开源的分布式搜索引擎,可以用于全文搜…

    other 2023年5月6日
    00
  • android布局——单复选框(今天上课的内容总结下)

    Android布局——单复选框 单复选框是Android布局中经常使用的UI组件,它们可以让用户选择或确定某些选项,进而影响App的行为。在本篇文章中,我们将详细介绍单复选框的使用方法及布局技巧。 单选框 单选框(RadioButton)是一组互斥的选项,用户只能选择其中的一项。单选框通过RadioGroup容器进行布局,RadioGroup容器内的Radi…

    其他 2023年3月28日
    00
  • git简单教程更新

    Git简单教程更新 Git是一种分布式版本控制系统,用于跟踪文件的更改并协调多个人之间的工作。本教程将介绍Git的基本概念和使用方法,以及如何在GitHub托管代码。 安装Git 在使用Git之前,需要先安装Git。可以从Git官网下载适合自己操作系统的安装包然后按照安装向导进行安装。 Git基本概念 在使用Git之前,需要了解一些基本概念: 库(Repos…

    other 2023年5月9日
    00
  • vue 动态添加的路由页面刷新时失效的原因及解决方案

    问题描述: 在使用 Vue.js 动态添加路由时,我们通常会使用 router.addRoutes() 方法实现,但是在这种情况下,动态添加的路由在页面刷新时会失效,导致无法访问相关页面。 原因分析: Vue.js 的路由机制是基于浏览器的 History API 实现的,因此当页面进行刷新时,浏览器会重新发送请求并加载页面,此时如果没有对动态添加的路由进行…

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