当前位置: 首页 > news >正文

C++:priority_queue类

目录

前言

数据结构

向上调整

less

greater

向下调整

push

pop

top

size

empty

完整代码


前言

priority_queue类的本质是堆,下面是数据结构中的实现

C数据结构:堆(实现、排序)-CSDN博客

它的实现也是和前面的栈和堆类似,一样用其他容器的成员函数来实现

数据结构

template<class T, class Container = std::vector<T>, class Compare = Less<T>>
class priority_queue
{
public:private:Container _con;
};

这里的模板需要有三个,T是堆里存储的数据类型,Container是实现堆的容器,Compare是决定堆是大堆还是小堆

容器默认用vector即可,因为它是需要下标访问的

Less是大堆,稍后我们可以自己使用仿函数实现这个Less

向上调整

要实现堆我们需要先实现向上调整和向下调整的函数

void AdjustUp(int child)
{Compare com;int parent = (child - 1) / 2;while (child > 0){if (com(_con[parent], _con[child])){std::swap(_con[parent], _con[child]);child = parent;parent = (child - 1) / 2;}else{break;}}
}

和数据结构中的实现一致,唯一有区别的地方就是比较的地方

这里我们使用了类里面的Compare,它定义了一个com,这里就用了这个com里面的仿函数来比较,Compare默认是Less,那么这个Less是什么呢?

less

template<class T>
class Less
{
public:bool operator()(const T& x, const T& y){return x < y;}
};

这里就是使用仿函数,里面返回小于的比较即可 

greater

template<class T>
class Greater
{
public:bool operator()(const T& x, const T& y){return x > y;}
};

也是仿函数,里面返回大于的比较即可 

如果使用原来的直接比较的方法我们只能通过改代码来更改大小堆

但是如果我们使用仿函数可以通过调整参数来决定是大堆还是小堆

向下调整

void AdjustDown(int parent)
{Compare com;int child = parent * 2 + 1;while (child < _con.size()){if (child + 1 < _con.size() && com(_con[child], _con[child + 1])){child++;}if (com(_con[parent], _con[child])){std::swap(_con[parent], _con[child]);parent = child;child = parent * 2 + 1;}else{break;}}
}

用了数据结构中的思路和上面向上调整的比较思路实现

push

void push(const T& x)
{_con.push_back(x);AdjustUp(_con.size() - 1);
}

push函数是向堆中插入数据

数据放到堆的最后,这时候将该元素向上调整成堆即可

pop

void pop()
{std::swap(_con[0], _con[_con.size() - 1]);_con.pop_back();AdjustDown(0);
}

pop函数是删除堆顶数据

只需要交换堆顶数据到最后,删除最后一个数据,并向下调整第一个数据即可

top

const T& top() const
{return _con[0];
}

top函数是返回堆顶数据

size

size_t size() const
{return _con.size();
}

size函数是返回堆的数据个数 

empty

bool empty() const
{return _con.empty();
}

empty函数是返回判断堆是否为空 

完整代码

#pragma once#include<iostream>
#include<vector>template<class T>
class Less
{
public:bool operator()(const T& x, const T& y){return x < y;}
};template<class T>
class Greater
{
public:bool operator()(const T& x, const T& y){return x > y;}
};namespace lyw
{template<class T, class Container = std::vector<T>, class Compare = Less<T>>class priority_queue{public:void AdjustUp(int child){Compare com;int parent = (child - 1) / 2;while (child > 0){if (com(_con[parent], _con[child])){std::swap(_con[parent], _con[child]);child = parent;parent = (child - 1) / 2;}else{break;}}}void push(const T& x){_con.push_back(x);AdjustUp(_con.size() - 1);}void AdjustDown(int parent){Compare com;int child = parent * 2 + 1;while (child < _con.size()){if (child + 1 < _con.size() && com(_con[child], _con[child + 1])){child++;}if (com(_con[parent], _con[child])){std::swap(_con[parent], _con[child]);parent = child;child = parent * 2 + 1;}else{break;}}}void pop(){std::swap(_con[0], _con[_con.size() - 1]);_con.pop_back();AdjustDown(0);}const T& top() const{return _con[0];}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:Container _con;};
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JavaScript class和正则
  • 10天速通Tkinter库——Day 5:使用config进行OptionMenu美化
  • Minio web控制台实现授权管理
  • 使用 nginx 搭建代理服务器(正向代理 https 网站)指南
  • 【Java】—— 使用Java编写程序找出100以内的质数
  • 理解类方法和静态方法:Python 中的高级函数
  • Nginx负载均衡调度状态
  • 哇哦--一起学习接口叭
  • XSS总结知识点+例题实操
  • 探索 HarmonyOS 的层叠布局:灵活的 Stack 容器
  • Vmware WorkStations 17 ,centos 安装 vmware tools
  • FFmpeg的入门实践系列一
  • 序列建模之循环和递归网络 - 渗漏单元和其他多时间尺度的策略篇
  • 帆软报表设计器函数相关问题
  • OLED整体刷新到结合switch刷新方式演变
  • 【前端学习】-粗谈选择器
  • AWS实战 - 利用IAM对S3做访问控制
  • CEF与代理
  • EventListener原理
  • golang 发送GET和POST示例
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • HTTP那些事
  • jquery cookie
  • React Native移动开发实战-3-实现页面间的数据传递
  • React+TypeScript入门
  • React-生命周期杂记
  • React组件设计模式(一)
  • springMvc学习笔记(2)
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 工作中总结前端开发流程--vue项目
  • 构造函数(constructor)与原型链(prototype)关系
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 基于组件的设计工作流与界面抽象
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 线性表及其算法(java实现)
  • 一些css基础学习笔记
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #QT(QCharts绘制曲线)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (1) caustics\
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (windows2012共享文件夹和防火墙设置
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (数据结构)顺序表的定义
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)跟我一起学习VIM - The Life Changing Editor