c++优先队列用法知识点总结

C++优先队列用法知识点总结

优先队列简介

优先队列是一个具有优先级的队列,可以确保元素按照一定的优先级顺序出队。C++中的优先队列底层使用堆实现,因此其时间复杂度为O(logn)。

优先队列的基本操作

插入一个元素

C++中,插入一个元素可以使用push()函数。

#include <queue>

priority_queue<int> my_pq; // 定义一个默认降序排列的优先队列
my_pq.push(10); // 向优先队列插入元素10

弹出队首元素

优先队列弹出队首元素可以使用pop()函数。

#include <queue>

priority_queue<int> my_pq;
my_pq.push(10);
my_pq.push(20);
my_pq.pop(); // 弹出队首元素10

获取队首元素

优先队列获取队首元素可以使用top()函数。

#include <queue>

priority_queue<int> my_pq;
my_pq.push(10);
my_pq.push(20);
int front_elem = my_pq.top(); // 获取队首元素20

优先队列的排序方式

默认降序

默认情况下,C++中的优先队列是按照元素的大小进行降序排列的。

#include <queue>

priority_queue<int> my_pq;
my_pq.push(10);
my_pq.push(20);
my_pq.push(5);
// 输出20 10 5
while (!my_pq.empty()) {
    cout << my_pq.top() << " ";
    my_pq.pop();
}

升序排列

我们可以通过定义自定义结构体或使用函数对象改变默认的降序排列,从而实现升序排列。

#include <queue>

struct cmp {
    bool operator() (int a, int b) {
        return a > b;
    }
};

priority_queue<int, vector<int>, cmp> my_pq;
my_pq.push(10);
my_pq.push(20);
my_pq.push(5);
// 输出5 10 20
while (!my_pq.empty()) {
    cout << my_pq.top() << " ";
    my_pq.pop();
}

复杂对象的排序

对于复杂对象,我们需要定义一个比较函数来完成排序。

#include <queue>
#include <string>

struct person {
    string name;
    int age;
};

struct cmp {
    bool operator() (const person& a, const person& b) {
        return a.age > b.age; // 按照年龄从小到大排列
    }
};

priority_queue<person, vector<person>, cmp> my_pq;
my_pq.push({"Mike", 25});
my_pq.push({"Tom", 18});
my_pq.push({"Jerry", 29});
// 按照年龄顺序输出Tom, Mike, Jerry
while (!my_pq.empty()) {
    cout << my_pq.top().name << " ";
    my_pq.pop();
}

示例说明

示例1

题目描述:从一个大小为n的整数数组中选择k个数,使它们的和最大。

首先,我们可以把这个数组放入一个降序排序的优先队列中。按照优先队列的定义,队首元素是最大的,这样我们可以从队列中弹出前k个元素,它们的和就是我们要的最大和。

#include <queue>
#include <vector>

using namespace std;

int find_max_sum(vector<int>& nums, int k) {
    priority_queue<int> my_pq(nums.begin(), nums.end());

    int sum = 0;
    for (int i = 0; i < k; i++) {
        sum += my_pq.top();
        my_pq.pop();
    }

    return sum;
}

int main() {
    vector<int> nums = {1, 4, 2, 3, 5, 7, 6};
    int k = 3;
    int max_sum = find_max_sum(nums, k); // 返回18
    return 0;
}

示例2

题目描述:在一个无序的序列中,找到第k大的数。

这个问题可以使用降序排列的小根堆来解决。首先,将数组中的前k个数放入小根堆中;然后遍历剩余的数,如果遇到比堆顶元素大的数,就将其弹出,将该数插入堆中。最后,堆顶元素就是第k大的数。

#include <queue>
#include <vector>

using namespace std;

int find_kth_largest(vector<int>& nums, int k) {
    priority_queue<int, vector<int>, greater<int>> my_pq(nums.begin(), nums.begin() + k);

    for (int i = k; i < nums.size(); i++) {
        if (nums[i] > my_pq.top()) {
            my_pq.pop();
            my_pq.push(nums[i]);
        }
    }

    return my_pq.top();
}

int main() {
    vector<int> nums = {1, 4, 2, 3, 5, 7, 6};
    int k = 3;
    int kth_largest = find_kth_largest(nums, k); // 返回5
    return 0;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++优先队列用法知识点总结 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 详解Andorid开发中反射机制是怎么一回事

    详解Android开发中反射机制是怎么一回事 什么是反射机制 反射机制是指在运行时动态获取类的信息、调用类的方法和访问类的属性的能力。在Android开发中,反射机制可以帮助我们实现一些灵活的功能,比如动态创建对象、动态调用方法、操作私有属性等。 使用反射机制的步骤 要使用反射机制,一般需要以下步骤: 获取需要操作的类的Class对象:可以通过类名、对象实例…

    other 2023年6月28日
    00
  • 深入了解Android IO的底层原理

    深入了解Android IO的底层原理 IO(输入输出)是Android系统中的基本操作之一。本攻略将深入探究Android IO的底层原理,包括如何使用Java IO和NIO进行文件读写,如何使用内存映射文件进行快速读写等内容。 Java IO Java IO是Android系统中最常用的IO操作方式之一,其底层实现基于操作系统提供的文件IO操作(read…

    other 2023年6月27日
    00
  • iOS16如何自定义Home应用程序 iOS16自定义Home应用程序方法

    iOS16如何自定义Home应用程序 在iOS 14及之前的版本中,我们只能通过在App库中搜索要添加的应用程序并将其放置在主屏幕上,但在iOS 15及之后的版本中,我们可以使用自定义应用库和自定义主屏幕来实现自定义排序和分类应用程序。本文将介绍如何使用iOS 16来自定义Home应用程序。 步骤1. 创建自定义应用程序 您可以在iOS 16的应用程序库中创…

    other 2023年6月25日
    00
  • Java 详解如何从尾到头打印链表

    Java 详解如何从尾到头打印链表 在Java中如何从尾到头打印链表呢?在这篇文章中,我们将探讨两种方法来实现这个问题。 方法一:使用递归函数 递归函数可以轻松解决反向打印链表的问题。下面是实现此方法的步骤: 首先,检查链表是否为空。如果链表为空,则返回。 否则,递归执行函数以遍历链表的下一个节点。 递归返回时,打印当前节点的值。 示例代码: public …

    other 2023年6月27日
    00
  • Java中类的加载顺序执行结果

    Java中类的加载顺序执行结果在类的实例化时非常重要,正确的理解和使用可以避免程序出现各种问题。以下是完整的攻略: 类的加载过程 首先,当程序需要使用某个类时,Java虚拟机会首先在内存中查找该类是否已经被加载(被其他类引用时可能已经被加载),如果没有被加载则开始类的加载过程。 类的加载过程分为以下几个步骤: 加载:虚拟机通过ClassLoader类加载器读…

    other 2023年6月27日
    00
  • iOS开发之UIScrollView详解

    iOS开发之UIScrollView详解 1. UIScrollView介绍 UIScrollView是iOS开发中经常用到的一个控件,它可以滚动显示其子视图,用于显示超过屏幕大小的内容。UIScrollView是iOS开发中比较基础的控件之一,学习它的使用可以为后续的开发打下坚实的基础。 2. UIScrollView的基本用法 2.1 UIScrollV…

    other 2023年6月27日
    00
  • java递归实现科赫雪花

    当我们想要用代码来生成科赫雪花时,可以采用递归的方式来完成。下面是实现科赫雪花的完整攻略。 1. 确定问题 首先,我们需要明确要解决的问题,也就是要生成一个科赫雪花。一般而言,科赫雪花是由很多个倒三角形组成的,整体形状如下图所示。 /\ / \ / \ / \ / \ / \ /____________\ 我们需要通过代码来生成这个图形。 2. 递归思路 为…

    other 2023年6月27日
    00
  • matplotlib 入门之Image tutorial

    Matplotlib入门之Image Tutorial的完整攻略 本文将为您详细讲解Matplotlib中Image Tutorial的内容,包括图像的读取、显示、处理和保存等内容。在文中,我们将使用Matplotlib 3.4.2版本作为示例。 图像的读取和显示 以下是使用Matplotlib读取和显示图像的步骤: 导入Matplotlib和Numpy库:…

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