深入了解C++优先队列(priority_queue)的使用方法

yizhihongxing

深入了解C++优先队列(priority_queue)的使用方法

什么是优先队列?

优先队列(Priority Queue)是一种数据结构,其本质是一个队列,但是队列中的元素都被赋予了优先级。优先级最高的元素最先被取出。

C++的优先队列(priority_queue)的用法

在C++中,优先队列(priority_queue)类定义在头文件中,其基本用法如下:

#include <queue>

std::priority_queue<T> pq; // 定义一个优先队列

其中,T代表队列中元素的类型。优先队列默认按照less从大到小排序,即优先级最高的元素为最大的元素。如果需要按照从小到大排序,则需要定义greater

std::priority_queue<int, std::vector<int>, std::greater<int>> pq; // 按照从小到大排序

push和pop

向优先队列中添加元素可通过push函数实现:

pq.push(10); 
pq.push(20); 
pq.push(30); 

从优先队列中取出元素可通过pop函数实现:

pq.pop(); // 取出最大的元素

top和empty

查看优先队列中最高优先级的元素可通过top函数实现:

std::cout << pq.top(); // 输出最大的元素

判断优先队列是否为空可通过empty函数实现:

if (pq.empty()) {
    std::cout << "优先队列为空";
}

示例1:使用优先队列来维护一个最大值队列

给定一个整型序列,我们需要动态维护其中的最大值。可以使用优先队列来实现:

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

int main()
{
    vector<int> v{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};

    priority_queue<int> q; // 定义一个优先队列

    for (int i = 0; i < v.size(); i++) {
        q.push(v[i]); // 将元素加入队列中
        cout << q.top() << " "; // 输出队列中的最大值
    }

    return 0;
}

输出结果为:

3 3 4 4 5 5 5 6 6 6 6

示例2:使用优先队列来实现堆排序

在堆排序中,利用最大堆或最小堆实现排序。使用优先队列来实现最大堆或最小堆,从而达到排序的效果:

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

int main()
{
    vector<int> v{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};

    priority_queue<int> q; // 定义一个最大堆

    for (int i = 0; i < v.size(); i++) {
        q.push(v[i]); // 将元素加入最大堆中
    }

    while (!q.empty()) {
        cout << q.top() << " "; // 从最大堆中取出元素
        q.pop();
    }

    return 0;
}

输出结果为:

9 6 5 5 5 4 3 3 2 1 1

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入了解C++优先队列(priority_queue)的使用方法 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • win10 1803更新1909错误0xc1900223怎么解决?

    问题描述 在安装Windows 10版本1803升级到版本1909时,出现错误代码0xc1900223,导致升级失败。请问如何解决此问题? 解决步骤 检查系统是否已经更新到最新版本的1803。 在开始进行升级前,建议先确认系统是否已经更新到最新版本的1803。如果系统不是最新的1803版本,可能会阻止升级到1909。如何确认系统版本,可以在“设置”中找到: …

    C 2023年5月23日
    00
  • C++浅析数据在内存中如何存储

    C++浅析数据在内存中如何存储 概述 在计算机科学中,数据在内存中如何存储是一个非常重要的问题。C++是一门非常流行的编程语言,了解C++中数据在内存中的存储方式有助于更好地理解C++程序的工作原理。 数据类型 C++中的数据类型有很多,包括整型、浮点型、字符型等。每一种数据类型在内存中的存储方式不同,下面我们就来具体讲解不同数据类型在内存中的存储方式。 整…

    C 2023年5月23日
    00
  • 一文详解C++模板和泛型编程

    一文详解C++模板和泛型编程 简介 C++模板是实现泛型编程的基础。泛型编程是一种编程范式,通过参数化来实现算法的一种方式。C++模板可以用来定义不特定类型的函数、类等,可以减少代码的重复编写,提高代码的可维护性和可复用性。 模板的定义和使用 函数模板 函数模板可以用来定义可以适用于多种类型的函数。函数模板需要使用关键字template定义,后面跟尖括号&l…

    C 2023年5月23日
    00
  • C++中基类和派生类之间的转换实例教程

    C++中基类和派生类之间的转换实例教程 什么是基类和派生类呢? 在C++中,基类和派生类是面向对象编程中的两个基本概念。基类通常是一个抽象的概念,它定义了一些通用的特征,在派生类中被继承和扩展。派生类则是从基类派生出来的类,它继承了基类的特性,并在此基础上增加了一些自己的特性。 转换示例 我们来看一个实际的示例,假设现在我们有一个基类People,和一个派生…

    C 2023年5月22日
    00
  • C++ 程序抛出异常后执行顺序说明

    当一个 C++ 程序在运行过程中遇到了异常情况,它可以通过抛出异常来通知上层代码进行异常处理。在此过程中,C++ 运行时会自动执行一些有序的操作步骤,以保证程序能够正确地处理异常。下面我们就来详细讲解一下这些操作步骤。 C++ 异常抛出和捕获机制 在 C++ 中,我们可以使用 throw 语句来抛出一份异常。其语法形式如下: throw exception_…

    C 2023年5月23日
    00
  • C语言中#define定义的标识符和宏实例代码

    我来给你讲解关于C语言中#define定义的标识符和宏的完整攻略。 定义标识符 在C语言中,使用#define关键字可以定义一个标识符,并将其代表的值替换到程序中。语法如下: #define 标识符 数值或表达式 其中,标识符可以是任意字符串,而数值或表达式则可以是任意C语言表达式,例如: #define PI 3.1415926 // 将标识符PI定义为3…

    C 2023年5月30日
    00
  • php中serialize序列化与json性能测试的示例分析

    PHP中的serialize和json都是用于数据序列化和反序列化的工具,但它们的运行效率存在巨大的差异。 本攻略着重分析serialize和json序列化及反序列化的各种用法和效率,提供PHP序列化和反序列化的最佳实践。 示例1:serialize序列化和反序列化方法的使用 PHP中的serialize方法可以将一个对象或者数组序列化成字符串。 序列化之后…

    C 2023年5月23日
    00
  • C++中的对象初始化操作代码

    下面就来详细讲解一下 C++ 中的对象初始化操作代码的完整攻略。 什么是对象初始化 在 C++ 中,定义一个对象后不仅要申请存储空间,还需要对对象进行赋值或初始化,以便使其具备正确的初始值和状态。对象初始化即是给刚申请的存储空间一个初始值和状态的过程,其作用是为了确保程序的正确性和安全性。因此,在使用对象之前应确保其已被正确初始化。 对象初始化方式 在 C+…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部