C++高级数据结构之优先队列

C++高级数据结构之优先队列

什么是优先队列?

优先队列是一种特殊的队列,其中每个元素都有一个优先级。当加入一个元素时,它会被放置在队列中的适当位置,以确保优先级最高的元素位于队头。从队列中取出元素时,总是从队头删除元素。

优先队列的应用

优先队列的常见应用场景包括:

  • 操作系统任务调度
  • 网络传输协议TCP中的拥塞控制算法
  • 各种图像算法如边缘检测等

C++中STL的优先队列

在C++中,STL中的优先队列是一种堆实现的优先队列,通过实现一个最大堆来保证队头为优先级最高的元素。STL的priority_queue模板类提供了快捷使用的优先队列类,可以在头文件queue中找到。

priority_queue的基本用法

声明一个priority_queue对象的基本语法为:

priority_queue<value_type, container_type, compare_function> pq;

其中:

  • value_type:表示存储在优先队列中的元素类型
  • container_type:表示用于存储元素的底层容器类型,默认是vector
  • compare_function:表示比较元素大小的函数对象,被默认定义为从大到小的比较函数

示例一:从小到大排序

下面是一个简单的例子,演示如何使用priority_queue从小到大排序。我们将使用默认的比较函数,因此只需声明一个priority_queue对象,并将所有元素依次插入即可。

#include <queue>
#include <iostream>
using namespace std;

int main() {
    priority_queue<int> pq;
    pq.push(3);
    pq.push(1);
    pq.push(4);
    pq.push(1);
    while (!pq.empty()) {
        cout << pq.top() << " ";
        pq.pop();
    }
    return 0;
}
// Output: 1 1 3 4

示例二:使用自定义比较函数

现在我们来看一个使用自定义比较函数的例子,我们将从大到小排序一个字符串列表,将比较函数定义为按字符串长度比较。

#include <queue>
#include <vector>
#include <iostream>
using namespace std;

bool cmp(const string& a, const string& b) {
    return a.size() < b.size();
}

int main() {
    vector<string> vec = {"hello", "world", "test", "priority", "queue"};
    priority_queue<string, vector<string>, decltype(&cmp)> pq(cmp);
    for (auto& s : vec) {
        pq.push(s);
    }
    while (!pq.empty()) {
        cout << pq.top() << " ";
        pq.pop();
    }
    return 0;
}
// Output: priority queue world hello test

总结

优先队列是一种常用的数据结构,C++中的STL提供了方便快捷的使用方式。无论是从小到大排序还是使用自定义比较函数,我们都可以通过STL的priority_queue轻松地实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++高级数据结构之优先队列 - Python技术站

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

相关文章

  • Java数据结构之简单链表的定义与实现方法示例

    Java数据结构之简单链表的定义与实现方法示例 什么是链表 链表是线性数据结构的一种,它是由一个个节点构成的,每个节点包含两个部分,一个是数据,另一个是指向下一个节点的引用,通俗的说,就像火车一样,每节火车都是一个节点,而每车头都指向下一节车厢。 链表的定义 Java中常用链表有单向链表和双向链表,单向链表每个节点只有一个指向下一个节点的引用,而双向链表每个…

    数据结构 2023年5月17日
    00
  • C语言数据结构旋转链表的实现

    C语言数据结构旋转链表的实现 1. 什么是旋转链表 旋转链表是一种特殊的链表,其特点是将链表的最后一个节点移动到最前面,形成一个环形链表的效果。比如下面这个链表: 1 -> 2 -> 3 -> 4 -> 5 经过一次旋转之后变成了: 5 -> 1 -> 2 -> 3 -> 4 2. 实现思路 旋转链表的实现思路…

    数据结构 2023年5月17日
    00
  • python数据结构树和二叉树简介

    下面是关于“Python数据结构树和二叉树简介”的详细攻略。 一、树的概念 树(Tree)是一种非常重要的数据结构,它是由n(n>0)个有限节点组成一个具有层次关系的集合。其中一个节点被称作根节点,它没有父节点;除根节点外,其他节点都有且只有一个父节点;每个节点可以有0个或多个子节点。一棵树的深度为树中层次最大的节点层数,根节点层次为1。 二、二叉树的…

    数据结构 2023年5月17日
    00
  • 一文吃透JS树状结构的数据处理(增删改查)

    一文吃透JS树状结构的数据处理(增删改查) 什么是树状结构 树状结构是一种经典的数据结构,在计算机领域中被广泛应用。树状结构由连通的节点组成,节点之间形成父子关系。一根树状结构的“根节点”没有父节点,每个子节点可以有多个“子节点”,但一个“子节点”只能有一个“父节点”。常见的应用包括文件系统、HTML DOM 和 JSON 数据格式等。 数据结构设计 我们以…

    数据结构 2023年5月17日
    00
  • C语言实现数据结构迷宫实验

    C语言实现数据结构迷宫实验攻略 简介 迷宫是计算机图形学中的一个经典问题,也是数据结构和算法中常见的题目。C语言是一种广泛使用的编程语言,具有充分的编程接口和功能,可以方便地实现迷宫算法和数据结构。 本文将详细讲解C语言实现数据结构迷宫实验的完整攻略,让读者能够更加深入地理解迷宫算法和数据结构的应用。 实现步骤 1. 创建迷宫结构体 首先需要创建一个迷宫结构…

    数据结构 2023年5月17日
    00
  • python算法与数据结构朋友圈与水杯实验题分析实例

    让我来详细讲解一下“python算法与数据结构朋友圈与水杯实验题分析实例”的完整攻略。 1. 前言 本文将分享两个Python的算法与数据结构问题,即朋友圈和水杯实验题。我们将分别介绍问题的背景、解题思路和代码实现。 2. 朋友圈问题 2.1 背景 给定一个M*N的矩阵,矩阵中的每个元素都是1或0。如果矩阵中的1元素相邻,即水平、垂直或对角线相邻,则将这些元…

    数据结构 2023年5月17日
    00
  • Java深入了解数据结构之哈希表篇

    Java深入了解数据结构之哈希表篇 1. 哈希表的定义 哈希表(Hash Table),也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构。通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数(Hash Function)。 哈希表是基于哈希函数实现的,哈希函数将关键字映射到哈希表中的位置,如果存在两个…

    数据结构 2023年5月17日
    00
  • EMI/EMS/EMC有什么关系?

    EMI(Electromagnetic Interference)直译是“电磁干扰”,是指电子设备(即干扰源)通过电磁波对其他电子设备产生干扰的现象。 从“攻击”方式上看,EMI主要有两种类型:传导干扰和辐射干扰。 电磁传导干扰是指干扰源通过导电介质(例如电线)把自身电网络上的信号耦合到另一个电网络。 电磁辐射干扰往往被我们简称为电磁辐射,它是指干扰源通过空…

    算法与数据结构 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部