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日

相关文章

  • stm32之入门知识

    STM32之入门知识 STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统开发。本文将提供一个完整的攻略,介绍STM32的入门知识,包括硬件和软件方面内容,并提供两个示例说明。 硬件 开发板 STM32开发板是学习和开发STM32的必备硬件常见的STM32开发板有ST官方的Nucleo系列、Discovery系列和EVAL系列,以…

    other 2023年5月8日
    00
  • Vue Transition实现类原生组件跳转过渡动画的示例

    Vue Transition实现类原生组件跳转过渡动画的示例攻略 1. 准备工作 首先,你需要在你的Vue项目中安装Vue-Router插件,用于实现路由功能。你可以使用以下命令进行安装: npm install vue-router 2. 添加路由配置 在你的Vue项目中的main.js文件中,引入Vue和Vue-Router,并且创建路由实例。在路由实例…

    other 2023年6月28日
    00
  • webpack简单学习的入门教程

    webpack简单学习的入门教程 简介 随着前端项目越来越复杂,JavaScript 文件也逐渐变得庞大而复杂。Webpack 是一个模块打包工具,可以将多个 JavaScript 文件打包成一个或多个的 bundle.js 文件。这不仅能提高页面加载速度,同时也能更好地管理我们的前端代码。 本文将介绍Webpack的基本概念和基础使用方法,帮助读者快速上手…

    其他 2023年3月28日
    00
  • js利用与或运算符优先级实现if else条件判断表达式

    在 JavaScript 中,可以使用与或运算符(&& 和 ||)来实现条件判断表达式。主要思路是利用与或运算符的优先级和短路特性来实现。 && 运算符的优先级高于 || 运算符,因此 && 运算符会先被执行。当 && 运算符的左边表达式为 true 时,会继续执行右边表达式;当左边表达式为 f…

    other 2023年6月27日
    00
  • 查看TensorFlow checkpoint文件中的变量名和对应值方法

    查看TensorFlow checkpoint文件中的变量名和对应值方法攻略 TensorFlow的checkpoint文件保存了模型的权重和变量值。如果你想查看这些变量名和对应的值,可以按照以下步骤进行操作: 步骤1:导入必要的库 首先,你需要导入TensorFlow和其他必要的库: import tensorflow as tf from tensorf…

    other 2023年8月8日
    00
  • 在安装完android程序以后“你的手机上未安装应用程序”的解决方案

    让我为你详细讲解如何解决“在安装完Android程序以后‘你的手机上未安装应用程序’”的问题。 问题描述 当你在手机上安装一个Android程序后,有时候你会发现你的手机上并没有安装该应用程序,而且也没有任何报错信息。这可能是由于Android系统的一些缓存问题导致的。 解决方案 以下是解决问题的完整攻略: 1. 清除Google Play Store的缓存…

    other 2023年6月25日
    00
  • 深入理解React虚拟DOM

    深入理解React虚拟DOM React是一个非常流行的JavaScript库,用于构建用户界面。React的核心思想是通过组件化的方式来构建应用程序,其中虚拟DOM是React的核心机制之一。了解虚拟DOM对于理解React的工作方式非常重要。 什么是虚拟DOM 虚拟DOM是一个JavaScript对象,描述了实际DOM的结构和信息。它是React用来描述…

    其他 2023年3月28日
    00
  • Python类和对象基础入门介绍

    以下是使用标准的Markdown格式文本,详细讲解Python类和对象的基础入门介绍的完整攻略: Python类和对象基础入门介绍 什么是类和对象? 类(Class)是一种抽象的概念,用于表示具有相同属性和行为的一组对象的集合。类定义了对象的共同特征和行为。 对象(Object)是类的实例,是具体的、具体化的实体,具有类定义的属性和行为。 如何定义一个类? …

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