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

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日

相关文章

  • java中TCP实现回显服务器及客户端

    Java中TCP实现回显服务器及客户端的步骤如下: 1. 编写服务器端程序 服务器端需要完成以下任务: 创建ServerSocket对象 ServerSocket serverSocket = new ServerSocket(8888); 监听客户端的连接请求 Socket socket = serverSocket.accept(); 读取客户端发送的数…

    other 2023年6月27日
    00
  • Kotlin Service服务组件开发详解

    下面就为您详细讲解“Kotlin Service服务组件开发详解”的完整攻略。 一、Kotlin Service是什么? Kotlin Service是Android应用程序组件,它可以在后台执行长时间运行的操作。它可以在不影响用户正常操作的情况下,持续地在后台处理与某些任务相关的逻辑,从而提高了应用程序的使用效率。 二、Kotlin Service的使用 …

    other 2023年6月27日
    00
  • django admin后管定制-显示字段的实例

    当我们在使用Django开发Web应用时,会使用到Django admin作为管理后台。但是Django admin默认情况下只显示了一些基本字段,有时我们需要定制显示哪些字段以及字段的顺序,本文将为你详细讲解Django admin后管定制-显示字段的实例。 Django admin显示字段默认值 首先,我们需要了解在Django admin中,每个Mod…

    other 2023年6月25日
    00
  • vue类名如何获取动态生成的元素

    获取动态生成元素的类名 示例 1 考虑以下的 HTML 结构: <div id="app"> <button @click="addDynamicElement">添加元素</button> <div class="dynamic-element">动…

    other 2023年6月28日
    00
  • 魔兽世界7.1痛苦术天赋神器路线及输出手法详解

    魔兽世界7.1痛苦术天赋神器路线及输出手法详解 痛苦术是魔兽世界中一种非常有趣的职业,它在近战和远程输出方面表现出色。本篇攻略将为大家详细讲解痛苦术神器路线和输出手法,并提供两个实例以说明。 神器路线 阶段1 升级“召唤掌控”(Call of the Void),这是单体输出的主力技能。 阶段2 在阶段2,你需要提高多目标技能的输出,目标是“召唤者”的书。 …

    other 2023年6月27日
    00
  • Django 解决由save方法引发的错误

    在使用 Django 时,很多人都会遇到“由 save 方法引发的错误”,这是因为 Django 的模型对象使用了数据校验。在使用数据持久化时,如果数据不符合模型约束,就会引发异常。 以下是 Django 解决由 save 方法引发的错误的完整攻略: 步骤一:查看错误信息 当使用 Django 的 save 方法保存数据时,如果出现错误,一定会抛出异常。这时…

    other 2023年6月27日
    00
  • amazondynamodb概览

    以下是“Amazon DynamoDB概览的完整攻略”的标准markdown格式文本,其中包含了两个示例说明: Amazon DynamoDB概览 Amazon DynamoDB是一种全托管的NoSQL数据库服务,提供快速、可扩展和高可用性的数据存储。本文将介绍Amazon DynamoDB的概览,包括如何创建表、何查询数据等。 1. 创建表 在Amazon…

    other 2023年5月10日
    00
  • 哔哩哔哩如何自定义视频操作面板 哔哩哔哩自定义视频操作面板的方法

    哔哩哔哩如何自定义视频操作面板 在哔哩哔哩上,用户可以自定义视频操作面板,以满足个人需求。自定义视频操作面板的方法如下: 方法一:通过网页端设置 打开哔哩哔哩官网,在登录后进入个人中心页面 在个人中心页面,点击「设置」选项进入设置页面 在设置页面,点击「播放器设置」选项 在播放器设置页面,可以看到「视频操作面板布局」选项 点击「视频操作面板布局」选项,可以看…

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