C++ 中”priority_queue” 优先级队列实例详解

C++ 中 "priority_queue" 优先级队列实例详解

1. 什么是优先级队列(Priority Queue)?

优先级队列是一种特殊的队列,它的元素按照一定的优先级进行排序和访问。在 C++ 中,我们可以使用 priority_queue 类来实现优先级队列。

2. priority_queue 类的基本用法

priority_queue 类定义在 <queue> 头文件中。以下是 priority_queue 类的基本用法:

#include <queue>

// 定义优先级队列,元素类型为 int,默认为大顶堆
std::priority_queue<int> pq;

// 向优先级队列中插入元素
pq.push(5);
pq.push(2);
pq.push(10);
pq.push(1);

// 访问优先级队列的顶部元素
int topElement = pq.top();
cout << "Top element: " << topElement << endl;

// 弹出优先级队列的顶部元素
pq.pop();

3. 修改优先级队列为小顶堆

默认情况下,priority_queue 是大顶堆,即元素的顺序按照从大到小进行排列。如果我们希望使用小顶堆,可以通过传入一个自定义的比较函数对象实现。

#include <queue>

// 定义小顶堆的比较函数对象
struct Compare {
    bool operator()(const int& a, const int& b) const {
        return a > b;
    }
};

// 定义小顶堆优先级队列
std::priority_queue<int, std::vector<int>, Compare> pq;

// 向小顶堆中插入元素
pq.push(5);
pq.push(2);
pq.push(10);
pq.push(1);

// 访问小顶堆的顶部元素
int topElement = pq.top();
cout << "Top element: " << topElement << endl;

// 弹出小顶堆的顶部元素
pq.pop();

4. 复杂类型元素的优先级队列

除了基本数据类型,我们也可以使用自定义的复杂类型作为优先级队列的元素,只需定义一个比较函数即可。

以学生类为例,我们根据学生的分数进行排列:

#include <queue>
#include <string>

// 学生类定义
class Student {
public:
    std::string name;
    int score;

    // 构造函数
    Student(const std::string& n, int s) : name(n), score(s) {}

    // 定义比较函数
    bool operator<(const Student& other) const {
        // 优先按分数从大到小排列
        if (score != other.score) {
            return score > other.score;
        }
        // 分数相同则按姓名的字典序排列
        return name > other.name;
    }
};

// 定义学生类的优先级队列
std::priority_queue<Student> pq;

// 向队列中插入学生对象
pq.push(Student("Alice", 90));
pq.push(Student("Bob", 80));
pq.push(Student("John", 95));

// 访问队列的顶部元素
Student topStudent = pq.top();
cout << "Top student: " << topStudent.name << ", Score: " << topStudent.score << endl;

// 弹出队列的顶部元素
pq.pop();

以上示例演示了如何使用自定义比较函数,将学生对象按照分数从高到低进行排列。

通过以上的说明,你应该能够理解和使用 C++ 中的 priority_queue 类了。记住根据需要选择合适的比较函数对象,并根据实际需求定义自定义的元素类型。

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

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

相关文章

  • dedecms 5.6 初始化数据体验包本地测试安装使用方法

    接下来我将详细讲解“dedecms 5.6 初始化数据体验包本地测试安装使用方法”的完整攻略。 前置条件 在开始之前,需要你已经安装好了PHP环境和dedecms 5.6版本。如果尚未安装,请先完成相关安装。 下载数据体验包 首先,需要到dederun官网上下载最新版的数据体验包。解压后,你会得到一个名为“dedecms-init.zip”的文件。 安装准备…

    other 2023年6月20日
    00
  • 从数据类型 varchar 转换为 numeric 时出错.

    下面是从数据类型 varchar 转换为 numeric 时出错的完整攻略,包括原因分析、解决方法和两个示例说明。 原因分析 在将 varchar 类型的数据转换为 numeric 类型时,可能会出现以下错误: 转换失败,因为输入字符串格式不正确。 转换失败,因为输入字符串超出了 numeric 类型的范围。 转换失败,因为输入字符串包含了非数字字符。 这些…

    other 2023年5月5日
    00
  • 安装并配置前端自动化工具——grunt

    安装并配置前端自动化工具——grunt的完整攻略 Grunt是一款前端自动化工具,可以帮助我们自动化完成一些重复性的任务,如压缩、合并、编译等。本文将为您提供安装并配置Grunt的完整攻略,包括安装、配置、使用和示例。 安装Grunt 在安装Grunt之前,您需要先安装Node.js和npm。安装完成后,您可以使用以下命令安装Grunt: npm insta…

    other 2023年5月6日
    00
  • ios12 beta2固件在哪下载 苹果iOS12 Beta2测试版固件下载地址分享

    iOS 12 Beta 2固件下载攻略 苹果公司发布了iOS 12 Beta 2测试版固件,本攻略将详细介绍如何下载该固件。请按照以下步骤进行操作: 步骤一:加入Apple开发者计划 首先,你需要加入Apple开发者计划。前往Apple开发者网站,点击\”加入Apple开发者计划\”按钮。 登录你的Apple ID账号,如果没有账号,请先注册一个。 选择适合…

    other 2023年8月4日
    00
  • MySQL数据表添加字段的三种方式

    当我们在使用MySQL数据库的时候,经常需要在数据表中添加新的字段,以满足业务需求的变更。MySQL提供了三种不同的方式来添加新字段: 使用ALTER TABLE语句添加新字段 使用INSERT INTO SELECT语句创建新表并复制数据 使用CREATE TABLE语句创建新表并将数据迁移至新表 下面我们来详细介绍这三种方式的具体操作步骤和示例说明。 1…

    other 2023年6月25日
    00
  • 64GB内存不够用怎么办 简单几招教你活用手机存储

    64GB内存不够用怎么办 简单几招教你活用手机存储 如果你的手机内存只有64GB,而且已经感到不够用了,别担心!下面是一些简单的方法,可以帮助你更好地利用手机存储空间。 1. 清理无用的文件和应用程序 首先,你可以通过清理无用的文件和应用程序来释放一些存储空间。在手机设置中,找到“存储”或“内存”选项,查看哪些应用程序占用了大量的存储空间。删除那些你不再使用…

    other 2023年8月1日
    00
  • Android百度地图实现搜索和定位及自定义图标绘制并点击时弹出泡泡

    请见以下完整攻略: Android百度地图实现搜索和定位及自定义图标绘制并点击时弹出泡泡 一、前言 Android百度地图是一款非常强大的地图工具,它集成了很多常用的地图功能,包括地图展示、搜索、定位等,也可以通过开发者的自定义需求来定制地图的样式、交互和功能。其中,本文将介绍如何在Android中使用百度地图实现搜索和定位,并自定义绘制图标并点击时弹出泡泡…

    other 2023年6月25日
    00
  • Opencv+Python实现缺陷检测

    Opencv+Python实现缺陷检测 Opencv是一个开源的计算机视觉库,提供了许多常用的图像处理函数和算法。Python是一种高级编程语言,能够轻松地使用Opencv进行图像处理和分析。本文将介绍使用Opencv和Python实现缺陷检测的方法。 缺陷检测的原理 缺陷检测是指识别和定位在图像中的缺陷部分。缺陷可以是任何形式的,例如裂纹、凸起、凹陷等等。…

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