IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++优先队列(priority_queue) -> 正文阅读

[C++知识库]C++优先队列(priority_queue)

首先要包含头文件#include<queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序它本质是一个堆实现的

基本操作

它的基本操作和队列基本操作相同:

  • top 访问队头元素
  • empty 队列是否为空
  • size 返回队列内元素个数
  • push 插入元素到队尾 (并排序)
  • emplace 原地构造一个元素并插入队列
  • pop 弹出队头元素
  • swap 交换内容

基本使用

定义:priority_queue<Type, Container, Functional>
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vectordeque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式。当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。
示例:

//升序队列,小顶堆
priority_queue <int,vector<int>,greater<int> > q;
//降序队列,大顶堆
priority_queue <int,vector<int>,less<int> >q;
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

例题:

在这里插入图片描述

菜鸡思考:

这个题挺离谱的,但不难想到最简单的方法应该是维护两个数组,前一半,后一半。这样应该会比整体排序/插入再寻找简单一点。但这么一想,其实只时刻需要知道前一个数组的最后一个以及后一个数组的最开始一个就可以了,这个时候就可以使用优先队列啦。

菜鸡标题:

class MedianFinder {
private:
    priority_queue<int> frontQueue;
    priority_queue<int, vector<int>, greater<int>> backQueue;
public:
    /** initialize your data structure here. */
    MedianFinder() {}
    void addNum(int num) {
        if (frontQueue.empty()) {
            frontQueue.push(num);
            return;
        }
        if (backQueue.size() + 1 == frontQueue.size()) {
            if ((backQueue.empty() && frontQueue.top() > num) || num <= frontQueue.top()) {
                backQueue.push(frontQueue.top());
                frontQueue.pop();
                frontQueue.push(num);
                return;
            }
            if (num >= frontQueue.top()) {
                backQueue.push(num);
                return;
            }
        } else {
            if (num <= backQueue.top()) {
                frontQueue.push(num);
            } else if (num > frontQueue.top()) {
                frontQueue.push(backQueue.top());
                backQueue.pop();
                backQueue.push(num);
            }
        }
        return;
    }
    double findMedian() {
        if (frontQueue.empty()) {
            return 0;
        }
        if (backQueue.empty() || frontQueue.size() == backQueue.size() + 1) {
            return frontQueue.top();
        }
        if (frontQueue.size() == backQueue.size()) {
            return ((double)frontQueue.top() + (double)backQueue.top()) / 2;
        }
        return 0;
    }
};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder* obj = new MedianFinder();
 * obj->addNum(num);
 * double param_2 = obj->findMedian();
 */
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-07 11:00:54  更:2022-05-07 11:01:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 3:13:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码