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日

相关文章

  • Linux CLI操作常用快捷键总结

    Linux CLI操作常用快捷键总结 在Linux命令行界面中,使用快捷键可以显著提高命令行操作效率。本文总结了一些操作常用的Linux CLI快捷键,方便大家参考。 Ctrl快捷键 以下为CTRL键与其他组合键的快捷键: 快捷键 作用 Ctrl + A 将光标移动至行首 Ctrl + E 将光标移动至行尾 Ctrl + C 中断正在运行的命令 Ctrl +…

    other 2023年6月26日
    00
  • 解决windows7中IP地址冲突故障的详细图文步骤

    解决Windows 7中IP地址冲突故障的详细图文步骤 步骤一:检查IP地址冲突 打开Windows 7的开始菜单,点击“控制面板”。 在控制面板中,选择“网络和Internet”。 在“网络和Internet”选项中,点击“网络和共享中心”。 在网络和共享中心窗口中,点击左侧的“更改适配器设置”。 在适配器设置窗口中,找到当前使用的网络连接,右键点击并选择…

    other 2023年7月30日
    00
  • C语言深入探索数据类型的存储

    C语言深入探索数据类型的存储 C语言中的数据类型是程序开发中不可避免的概念,了解数据类型的存储方式,可以帮助开发者更好地理解系统底层,从而完善代码的设计与优化。本文将从以下几点详细讲解数据类型的存储方式: 数据类型的内存分配 数据类型的对齐方式 示例说明 数据类型的内存分配 在C语言中,数据类型的内存分配与其所占用的字节数有关。下表是C语言中基本数据类型所占…

    other 2023年6月27日
    00
  • 微信小程序全局配置及常用配置项详解

    微信小程序全局配置及常用配置项详解 什么是微信小程序配置文件 每个微信小程序都需要一个配置文件app.json。这个文件用来对小程序进行一些全局性的配置,例如设置页面路径、窗口背景色、顶部条颜色等等,而且这些配置无论在哪个页面都能生效。 app.json配置文件结构 一个app.json文件包括了整个小程序的全局配置,是一个全局性的配置文件,不需要放在pag…

    other 2023年6月25日
    00
  • vue自定义封装按钮组件

    下面我来详细讲解一下“Vue自定义封装按钮组件”的完整攻略。 1.确定组件需求和功能 在进行组件的自定义封装之前,我们需要先确定组件的需求和功能。所以,在开始之前,我们需要考虑以下几个问题: 我们的组件需要具有什么样的功能? 我们的组件需要支持哪些属性传递? 我们的组件需要支持哪些事件传递? 针对这些问题,我们先来确定一下我们的组件需求: 提供基本的按钮功能…

    other 2023年6月25日
    00
  • C语言学习之函数知识总结

    C语言学习之函数知识总结 函数的定义和调用 函数是指一段封装好的代码块,可以做特定的任务或者返回一个值。在C语言中,函数可以通过以下方式定义: 返回值类型 函数名(参数1类型 参数1名, 参数2类型 参数2名, …) { //函数体 return 返回值; } 其中,返回值类型指的是函数计算出来的结果的类型,参数1类型和参数2类型指的是传递给函数的参数的…

    other 2023年6月27日
    00
  • md5 16位二进制与32位字符串相互转换示例

    MD5 16位二进制与32位字符串相互转换示例攻略 MD5是一种常用的哈希算法,它通常以32位字符串的形式表示。然而,有时候我们可能需要将MD5值转换为16位二进制,或者将16位二进制转换为32位字符串。下面是一个详细的攻略,包含两个示例说明。 示例一:将32位字符串转换为16位二进制 首先,我们需要将32位字符串表示的MD5值转换为16进制数。例如,假设我…

    other 2023年7月28日
    00
  • ArcGis基础——相接面制造指定距离的分隔带

    ArcGis基础——相接面制造指定距离的分隔带 在ArcGis中,我们可以使用叠置分析工具轻松制造一些指定了距离的分隔带。下面就以一个实例来说明如何操作。 数据准备 我们需要两个数据集:需要制造分隔带的主数据集和制造分隔带所需要的参考数据集。 为了演示方便,我们可以使用默认预装的示例数据:USA_Major_Highways.shp和USA_States.s…

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