C++实现优先队列的示例详解

yizhihongxing

C++实现优先队列的攻略

什么是优先队列?

优先队列是一种特殊的队列,可以根据元素的优先级进行排序和取出元素。即出队时,出队的元素是队列中所有元素中优先级最高的元素。优先队列常常用于任务调度、数据压缩、图像处理等领域。

C++中优先队列的实现

为了方便使用优先队列,C++提供了<queue>库,其内置了优先队列的数据结构,可以直接使用。这个库的底层实现是以堆排序为基础的。使用C++实现优先队列的基本步骤如下:

  1. 导入头文件:#include <queue>

  2. 定义优先队列:priority_queue<int> pq;

  3. 对优先队列进行插入、删除和查询操作。优先队列的常用操作如下:

    • push:插入一个元素。

    • pop:删除队首元素。

    • top:返回队首元素。

    • empty:判断队列是否为空。

    • size:返回队列大小。

  4. 在使用优先队列时,需要定义一个元素的优先级,这个通过结构体或类实现。将元素作为结构体或类的成员变量,通过重载比较运算符(<、>)来实现优先级的判断。

C++实现优先队列的示例详解

示例一:求一组数的中位数

在一个包含n个数字的数组中,查找中位数需要对所有数字进行排序或者使用优先队列。

我们可以定义一个小根堆和大根堆,存储比中位数小的数和比中位数大的数,并维护两个堆的大小以保证中位数是第(n+1)/2个数。

代码如下:

#include <queue>
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int n, x;
    cin >> n;

    priority_queue<int, vector<int>, greater<int>> larger; // 小根堆
    priority_queue<int, vector<int>, less<int>> smaller; // 大根堆

    for(int i=0; i<n; i++)
    {
        cin >> x;

        // 将x加入到larger或smaller中
        if(larger.size() == 0 || x <= larger.top())
            larger.push(x);
        else
            smaller.push(x);

        // 调整larger和smaller的大小
        if(larger.size() > (n+1)/2)
        {
            int temp = larger.top();
            larger.pop();
            smaller.push(temp);
        }
        else if(smaller.size() > n/2)
        {
            int temp = smaller.top();
            smaller.pop();
            larger.push(temp);
        }

        // 输出当前的中位数
        if((i+1)%2 == 0)
            cout << (smaller.top()+larger.top())/2 << endl;
        else
            cout << larger.top() << endl;
    }
    return 0;
}

示例二:使用自定义的结构体来实现优先队列

我们定义一个结构体 person ,包含姓名和年龄两个成员变量,按照年龄从小到大的顺序来排序。

定义一个比较函数 cmp,使用 less 来定义小于号顺序,使用重载运算符 () 来实现比较。

代码如下:

#include <queue>
#include <iostream>
#include <string>

using namespace std;

struct person {
    string name;
    int age;
};

struct cmp {
    bool operator() (const person &a, const person &b) {
        return a.age > b.age;
    }
};

int main()
{
    priority_queue<person, vector<person>, cmp> pq;

    person p1 = {"Tom", 20};
    person p2 = {"Jerry", 18};
    person p3 = {"John", 23};

    pq.push(p1);
    pq.push(p2);
    pq.push(p3);

    while(!pq.empty()) {
        person p = pq.top();
        pq.pop();
        cout << p.name << " " << p.age << endl;
    }

    return 0;
}

输出:

Jerry 18
Tom 20
John 23

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现优先队列的示例详解 - Python技术站

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

相关文章

  • mac下googlechromehelper占用内存过高的一个排查过程记录

    Mac下GoogleChromeHelper占用内存过高的一个排查过程记录 很多人在使用Mac电脑时都会遇到一个问题:当打开Google Chrome浏览器并访问一些网站时,会导致chrome浏览器的helper进程(Google Chrome Helper)的内存占用异常升高,最终导致整个Mac系统变得缓慢,甚至宕机。 下面将介绍一些排查过程,帮助大家解决…

    其他 2023年3月29日
    00
  • 学习如何书写整洁规范的HTML标记

    学习如何书写整洁规范的HTML标记攻略 HTML是一种用于创建网页的标记语言,编写整洁规范的HTML标记对于构建可维护和易于理解的网页至关重要。下面是一个详细的攻略,帮助你学习如何书写整洁规范的HTML标记。 1. 使用语义化的标签 语义化的标签能够更好地描述内容的结构和含义,使得网页更易于理解和维护。以下是一些常用的语义化标签: <header&gt…

    other 2023年7月28日
    00
  • 怎么免费激活NiceLabel Designer 附激活步骤+补丁

    怎么免费激活NiceLabel Designer 如果你需要使用NiceLabel Designer却不想花费大量金钱购买正版软件,那么可以通过以下方法进行免费激活。 步骤 第一步:下载NiceLabel Designer软件及补丁 在互联网上下载NiceLabel Designer安装包及其激活补丁。注意:一定要下载安装包和补丁的最新版本。 第二步:安装N…

    other 2023年6月26日
    00
  • IOS CocoaPods详解之制作篇

    iOS CocoaPods详解之制作篇 介绍 CocoaPods是一个用于管理iOS项目中第三方库依赖的工具。本篇攻略将详细讲解如何制作自己的CocoaPods库。 步骤 1. 创建项目 首先,创建一个新的iOS项目作为你的CocoaPods库的示例项目。 2. 编写代码 在示例项目中编写你的库的代码。确保代码是可复用的,并且符合CocoaPods库的要求。…

    other 2023年8月5日
    00
  • Kotlin中的一些技巧与迂回操作分享

    Kotlin中的一些技巧与迂回操作分享 介绍 在Kotlin中,有些技巧和操作可以极大地提高我们的开发效率和代码的质量。本文将分享一些常用的Kotlin技巧和迂回操作,希望对开发Kotlin应用程序有所帮助。 技巧和操作 ?. 操作符 在Java中,为了避免NullPointerException异常,我们需要像下面这样判断变量是否为空: if (str !…

    other 2023年6月26日
    00
  • cnpm不是内部命令的解决方案:配置环境变量【推荐】

    下面是“cnpm不是内部命令”的解决方案:配置环境变量。 问题描述 在使用npm安装依赖包时,有时候会出现像下面这样的提示: ‘cnpm’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 这是因为cnpm并不是npm自带的命令,而是需要额外进行安装的。而如果我们每次都需要在命令行中使用npm install -g cnpm来安装cnpm,则使用起来非…

    other 2023年6月26日
    00
  • Android自定义封装banner组件

    下面是关于“Android自定义封装banner组件”的完整攻略及示例说明: 一、需求分析 首先需要明确的是,我们要完成一个可以实现轮播功能的banner组件,封装成库方便项目使用。在项目实现中需要考虑到以下要求: 能够自动轮播,滑动时停止轮播,松手后恢复自动轮播。 支持手动轮播,用户可以通过滑动手势进行轮播(滑动过程中不断切换banner)。 支持网络图片…

    other 2023年6月25日
    00
  • NOI Linux 快速入门指南

    NOI Linux 快速入门指南的完整攻略 本文将为您详细讲解 NOI Linux 快速入门指南,包括介绍、安装、常用命令、示例说明等内容。 介绍 NOI Linux 是一款基于 Ubuntu 的 Linux 发行版,专门为竞赛选手和程序员设计。它提供了一系列优秀的开发工具和编程环境,可以帮助用户更加高效地进行编程和竞赛。 安装 NOI Linux 的安装非…

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