当前位置: 首页 > article >正文

STL容器之priority_queue的常用功能和操作

在C++标准模板库(STL)中,priority_queue是一个非常重要的容器适配器,它提供了一个优先级队列的功能,允许元素根据优先级进行排序。这种数据结构在许多算法和应用中都非常有用,比如任务调度、Dijkstra算法中的边权最短路径问题等。

目录

基本功能

定义与特性

主要操作

默认行为

应用场景

实例

代码解析


基本功能

定义与特性

priority_queue是一个出队时总是取出最大元素的队列,它默认使用元素类型的<操作符来确定元素的优先级,即默认为大顶堆。priority_queue只允许对队列的顶部元素进行访问,即最大的元素。

主要操作

  • empty():检查队列是否为空。
  • size():返回队列中的元素数量。
  • top():访问队列顶部的元素(不删除)。
  • push():向队列中添加一个元素。
  • pop():移除队列顶部的元素。

默认行为

默认情况下,priority_queue是一个最大值优先的队列。如果你需要一个最小值优先的队列,可以通过传递第三个模板参数greater<ValueType>来实现。当处理的数据不仅仅是简单的数值,而是包含多个属性的结构体时,priority_queue可以通过自定义比较函数来处理这些结构化数据。

应用场景

priority_queue在需要根据优先级处理元素的场景中非常有用,例如:

  • 任务调度:根据任务的紧急程度来处理。
  • Dijkstra算法:用于存储未访问顶点的边权值。
  • Huffman编码:用于构建最优前缀编码。

实例

#include <bits/stdc++.h>
using namespace std;

struct game {
    int year;
    int money;
};

struct compare_outbig {
    bool operator()(const game& game1, const game& game2) {
        return game1.money < game2.money; // 钱少的在堆下,多的在顶部,输出最大的
    }
};

struct compare_outsmall {
    bool operator()(const game& game1, const game& game2) {
        return game1.money > game2.money; // 钱多的在堆下,少的在顶部,输出最小的
    }
};

int main() {
    priority_queue<int> out_big;
    priority_queue<int, vector<int>, greater<int>> out_small;
    priority_queue<game, vector<game>, compare_outbig> struct_out_big;
    priority_queue<game, vector<game>, compare_outsmall> struct_out_small;

    int n = 1;
    while (n) {
        cin >> n;
        out_big.push(n);
        out_small.push(n);
    }

    int m = 1;
    while (m) {
        cin >> n >> m;
        game sample1;
        sample1.year = n;
        sample1.money = m;
        struct_out_big.push(sample1);
        struct_out_small.push(sample1);
    }

    cout << "out_big" << endl;
    while (!out_big.empty()) {
        cout << out_big.top() << endl;
        out_big.pop();
    }

    cout << "out_small" << endl;
    while (!out_small.empty()) {
        cout << out_small.top() << endl;
        out_small.pop();
    }

    cout << "struct_out_big" << endl;
    while (!struct_out_big.empty()) {
        game sample1 = struct_out_big.top();
        cout << "game_money:" << sample1.money << "game_:" << sample1.year << endl;
        struct_out_big.pop();
    }

    cout << "struct_out_small" << endl;
    while (!struct_out_small.empty()) {
        game sample1 = struct_out_small.top();
        cout << "game_money:" << sample1.money << "game_:" << sample1.year << endl;
        struct_out_small.pop();
    }

    return 0;
}

代码解析

在这个例子中,我们定义了两个结构体game和两个比较函数compare_outbigcompare_outsmall,用于自定义priority_queue的行为。我们创建了四个优先队列,分别用于存储整数和game结构体,并根据金额进行排序。

  • out_bigout_small分别存储整数类型的大顶堆和小顶堆。
  • struct_out_bigstruct_out_small分别存储game结构体的大顶堆和小顶堆。

http://www.kler.cn/a/405955.html

相关文章:

  • Web 入门
  • 如何复制只读模式下的腾讯文档
  • AspectJ 对于 AOP 的实现
  • ara::com 与 AUTOSAR 元模型的关系总结
  • SpringBoot(8)-任务
  • conda 创建环境失败故障解决记录
  • 初识Linux · 信号处理 · 续
  • 区块链安全常见的攻击——不安全的 Delegatecall 漏洞(Unsafe Delegatecall Vulnerability)【3】
  • 类和对象( 中 【补充】)
  • 关于xftp7 的中文乱码问题
  • C语言执行Lua进行错误处理
  • FPGA 14 ,硬件开发板分类详解,FPGA开发板与普通开发板烧录的区别
  • 优化 Spring Boot 性能
  • ubuntu22.04 android studio老卡
  • 滚珠导轨在极端温度下性能如何?
  • redis6.0之后的多线程版本的问题
  • 泷羽sec学习打卡-网络七层杀伤链1
  • 基于Java Springboot甘肃“印象”网站
  • 机器学习阶段学习Day31
  • 最长回文子串
  • 动态规划 —— 子数组系列-环绕字符串中唯⼀的子字符串
  • 工业相机视场角计算
  • java版工程项目管理系统源码:Spring Cloud与前后端分离的完美结合
  • 可视化建模与UML《协作图实验报告》
  • 五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
  • 人工智能在金融领域的应用与风险防范研究