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日

相关文章

  • 比特币开发者有多少比特币?比特币开发者有的比特币数量分析

    比特币开发者有多少比特币? 比特币开发中有许多开发者和贡献者,但其具体持有的比特币数量并没有公开透明的渠道。然而,可以通过一些间接的方式来推测比特币开发者持有的比特币数量。 比特币发起人中本聪 比特币的发起人中本聪一直以匿名身份存在,因此也无法确定他到底持有多少比特币。根据比特币系统设计,中本聪自己挖掘的前50个区块将分配给自己,这意味着他可能拥有大约100…

    other 2023年6月28日
    00
  • Linux内核链表实现过程

    首先我们需要知道链表是什么。链表是一种数据结构,它由一系列节点组成,其中每个节点都包含一个指向下一个节点的指针。链表可以动态地添加或删除节点,使其具有灵活性。接着,我们来看看如何在Linux内核中实现链表。 实现步骤 以下是Linux内核中实现链表的步骤: 定义链表节点结构体,通常包含两个成员:指向下一个节点的指针和一个数据成员。 c struct list…

    other 2023年6月27日
    00
  • uniapp开发小程序的经验总结

    Uniapp开发小程序经验总结 简介 Uniapp 是一种跨平台开发框架,可以使用 Vue.js 语法来实现开发,一份代码可以同时编译为小程序、H5、APP 等多种平台。本文将讲解在 Uniapp 开发小程序时的经验总结。 项目初始化 在创建好项目后,首先需要在 manifest.json 文件中进行配置,包括 appid、sitemapLocation、p…

    other 2023年6月27日
    00
  • android 自定义圆角button效果的实例代码(自定义view Demo)

    细致的攻略如下。 1. 准备工作 首先,我们需要在Android Studio中创建一个新项目。然后,在项目中创建一个名为“RoundButton”的java文件,并扩展Button类。接着,我们需要重写onDraw方法,在其中实现自定义圆角按钮的效果。最后,在布局文件中使用自定义的Button组件。 2. 实现圆角按钮效果 以下是实现自定义圆角按钮效果所需…

    other 2023年6月25日
    00
  • Win7无法正常运行应用程序怎么解决?

    Win7无法正常运行应用程序怎么解决? 1. 检查应用程序兼容性 一些应用程序是不兼容旧的操作系统或者需要特定的操作系统版本,因此在安装应用程序之前,务必查看应用程序的系统要求,确保应用程序是Windows 7系统兼容的。如果应用程序本身设计就不兼容Windows 7系统,那么无论怎样调整都无法解决无法正常运行的问题。 例如,有些老旧的游戏软件需要Windo…

    other 2023年6月25日
    00
  • elementui框架中文网

    ElementUI 框架中文网攻略 ElementUI 是一款基于 Vue.js 的 UI 组件库,它提供了丰富的 UI 组件和交互效果,可以帮助开发者快速构建 Web 应用。在本攻略中,我们将介绍 ElementUI 框架中文网的使用方法,并提供两个示例说明。 ElementUI 框架中文网 UI 框架中文网是UI 官方提供的中文文网站,其中包含了 Ele…

    other 2023年5月6日
    00
  • CP Header/常见端口

    CP Header/常见端口 CP Header是什么? CP Header(Control Panel Header)是指控制面板的标题栏。一般来说,如果想要访问某个网站的管理后台,就需要输入网址后加上一段特殊的路径,例如“/admin”、“/wp-admin”等等。而这些特殊的路径实际上就是CP Header,用于区分普通网页和管理后台。 常见端口是哪些…

    其他 2023年3月28日
    00
  • 微信公众平台通用接口api指南

    以下是微信公众平台通用接口API指南的完整攻略,包含两个示例说明: 微信公众平台通用接口API概述 微信公众平台通用接口API是指微信公众平台提供的一组接口,用于开发者与微信公众平台进行交互。这些接口包括获取用户信息、发送消息、创建菜单、获取素材等功能。 微信公众平台通用接口API可以帮助开发者实现与微信公众平台的对接,实现自定义的业务逻辑和功能。 微信公众…

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