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日

相关文章

  • python魔法方法-自定义序列详解

    python魔法方法-自定义序列详解 Python中的“魔法方法”允许开发者在自定义类型时覆盖Python的内部方法,从而扩展自己的类型。自定义序列是Python中使用魔法方法的常见应用之一。 基本序列协议 在Python中,序列是指能够按顺序访问元素的对象。标准库中的列表(list)、元组(tuple)、字符串(str)、字节数组(bytes array)…

    other 2023年6月25日
    00
  • ubuntu系统下向U盘拷贝数据提示目标是只读的

    当在 Ubuntu 系统下向 U 盘拷贝数据时,如果提示目标是只读的,则可能是因为以下原因: U 盘的物理开关被关闭 U 盘的文件系统损坏 U 盘被当成了只读设备 解决方法如下: 确认 U 盘未被锁定 有些 U 盘会带有物理开关,当开关处于锁定状态时,系统将无法从 U 盘读取或写入数据,这可能是导致 U 盘只读的原因之一。请打开 U 盘物理开关以解锁,然后再…

    other 2023年6月27日
    00
  • python机器学习笔记:svm(1)——svm概述

    以下是“Python机器学习笔记:SVM(1)——SVM概述”的详细讲解,过程中包含两个示例说明的标准Markdown格式文本: Python机器学习笔记:SVM(1)——SVM概述 支持向量机(Support Vector Machine,SVM)是一种常用的分类算法,它可以在高维空间中找到一个最优的超平面,将不同类别的数据分开。本文将介绍SVM的概述,包…

    other 2023年5月10日
    00
  • ThinkPHP模板Volist标签嵌套循环输出多维数组的方法

    ThinkPHP模板Volist标签嵌套循环输出多维数组的方法攻略 ThinkPHP是一款流行的PHP开发框架,它提供了强大的模板引擎,其中的Volist标签可以用于循环输出数组数据。本攻略将详细介绍如何使用ThinkPHP模板Volist标签嵌套循环输出多维数组的方法。 步骤一:准备数据 首先,我们需要准备一个多维数组作为示例数据。假设我们有一个名为$da…

    other 2023年7月28日
    00
  • Java递归遍历文件目录代码实例

    下面是“Java递归遍历文件目录代码实例”的完整攻略。 目录 简介 代码实现 示例说明 示例一 示例二 简介 在Java中如何递归地遍历文件目录呢?Java提供了File类,可以很方便地对文件和目录进行操作。我们可以通过File类的listFiles()方法获取当前目录下的所有文件和目录,然后递归地遍历每一个目录。 代码实现 下面是Java递归遍历文件目录的…

    other 2023年6月27日
    00
  • 教你升级到IOS9免开发者账号激活的方法

    教你升级到iOS 9免开发者账号激活的方法 苹果公司在iOS 9推出后,为了防止未经授权的App被安装到设备上,增加了对开发者账号的限制。如果你没有开发者账号,就无法安装一些自己编写的应用,或是一些非App Store上的应用。本文将向大家介绍一种免开发者账号激活的方法,以方便大家自由地使用自己的iOS设备。 步骤1. 下载iOS 9 Beta 苹果公司在推…

    other 2023年6月26日
    00
  • 数据结构之矩阵行列和相等的实例

    数据结构之矩阵行列和相等的实例完整攻略 什么是矩阵行列和相等 矩阵行列和相等指的是对于一个n行m列的矩阵,如果它的每一行的和和每一列的和都相等,那么这个矩阵就满足矩阵行列和相等的条件。 怎样判断矩阵行列和相等的条件 对于一个n行m列的矩阵,如果它满足矩阵行列和相等的条件,那么它的每一行的和应该是相等的,它的每一列的和也应该是相等的。 因此,可以遍历每一行和每…

    other 2023年6月27日
    00
  • 如何设置本地连接ip 本机固定IP地址设置方法

    如何设置本地连接IP – 本机固定IP地址设置方法 在本机上设置固定IP地址可以确保网络连接的稳定性和一致性。下面是设置本地连接IP的详细攻略: 步骤1:打开网络和共享中心 首先,打开控制面板并点击“网络和共享中心”。 步骤2:选择本地连接 在“网络和共享中心”窗口中,找到并点击“本地连接”(或其他类似名称的网络连接)。 步骤3:打开属性窗口 在“本地连接”…

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