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

yizhihongxing

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日

相关文章

  • 浅谈Java内存区域划分和内存分配策略

    浅谈Java内存区域划分和内存分配策略 Java内存区域划分和内存分配策略是Java虚拟机(JVM)管理内存的重要组成部分。了解这些概念对于理解Java程序的内存使用和性能优化至关重要。 Java内存区域划分 Java虚拟机将内存划分为以下几个区域: 程序计数器(Program Counter Register):程序计数器是一块较小的内存区域,它保存着当前…

    other 2023年8月2日
    00
  • Golang实现将视频按照时间维度剪切的工具

    当我们谈到视频处理时,一个常见的需求是根据时间维度对视频进行剪切,这可以用于在大型视频项目中选出一部分精彩的片段,或者在视频编辑软件中编辑某个视频的一部分。在这里,我们将介绍如何使用 Golang 实现视频剪切的工具。 工具基本原理 视频剪切的基本原理是:使用视频处理库来解析视频文件,然后在指定时间段内进行截取。在 Golang 中,我们可以使用 FFMPE…

    other 2023年6月27日
    00
  • 全面解析Bootstrap表单使用方法(表单控件)

    全面解析Bootstrap表单使用方法(表单控件) 什么是Bootstrap表单控件? Bootstrap表单控件是Bootstrap框架的一部分,它提供了一套预定义的、可重用的表单样式和布局,可以方便地构建各种类型的表单。 Bootstrap表单控件的结构 Bootstrap表单控件通常由以下元素组成: 表单标签(<form>元素) 表单组(&…

    other 2023年6月27日
    00
  • Ubuntu 下忘记用户名和登录密码的解决方法

    当你忘记Ubuntu登录的用户名和密码时,可以通过以下步骤来解决此问题: 步骤一:进入救援模式 首先,你需要进入救援模式。启动电脑后,按住SHIFT键不放,进入启动菜单,选择高级选项,然后选择救援模式。系统会提示你选择哪种救援模式,在此处选择 root Drop to root shell prompt。 步骤二:挂载系统文件系统 在root shell提示…

    other 2023年6月27日
    00
  • Spring Boot集成netty实现客户端服务端交互示例详解

    Spring Boot集成Netty实现客户端服务端交互示例详解 介绍 Netty是一个基于Java的专业高性能网络通信框架,其提供了非常优秀的网络通信功能和容易扩展的API。而Spring Boot则是一个具有高度自动化和约定优于配置的约定框架,其简化了Spring的开发流程。通过将两者结合起来,可以更加轻松、方便地实现网络通信的开发。 本文将详细讲解如何…

    other 2023年6月27日
    00
  • Win10怎么升级到17127.1版? Win10预览版17127.1很卡的解决办法

    Win10如何升级到17127.1预览版 如果你已经是Win10预览版用户,可以通过以下步骤升级到17127.1版本: 在桌面搜索栏中输入Windows Update,打开Windows Update设置; 点击“检查更新”按钮,等待系统自动检测更新; 如果系统检测到更新版本,就会显示“Windows 10 Insider Preview XXXXX”; 点…

    other 2023年6月27日
    00
  • ftp服务器访问主动模式、被动模式

    FTP服务器访问主动模式、被动模式 FTP(File Transfer Protocol)是一种网络协议,主要用于文件传输。在FTP服务器访问过程中,有两种传输模式:主动模式和被动模式。 主动模式(Active Mode) 在主动模式中,客户端使用随机端口请求服务器的数据端口,而服务器使用固定端口进行响应。具体流程如下: 客户端从端口N向FTP服务器的21端…

    其他 2023年3月28日
    00
  • ScriptManager 发送错误到客户端

    ScriptManager 发送错误到客户端 在 ASP.NET 中,ScriptManager 控件的主要作用是管理页面中的局部更新流程,它可以将服务器端的数据更新到客户端的页面上。除此之外,ScriptManager 还为我们提供了一个发送错误信息到客户端的方法,方便我们调试客户端 JS 代码时的问题。本文将介绍如何在 ASP.NET 中使用 Scrip…

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