模仿库实现priority_queue

1 priority_queue

1.1 概念

优先级队列,一种大/小堆(默认为大堆)

1.2 大堆和小堆

一种完全二叉树,大堆根节点一定比子字节大

小堆根节点一定比子字节小

向下调整

从根节点开始比较与子节点的大小不断向下 

向上调整

找到最后一个非叶子节点,比较数值和父节点的大小,向上不断调整

1.3 框架说明

less和greater库中有,注释部分为模拟

不提供遍历所以不用写itreater

1.4 代码实现

namespace my_priority
{
    //仿函数
    //用类模仿函数
    //通过重载括号实现
    //template<class T>
    //小堆
    //struct less
    //{
    //    bool operator()(T a,T b)
    //    {
    //        if (a < b)
    //        {
    //            return 1

    //        }
    //        else
    //        {
    //            return 0
    //        }
    //    }
    //};
    //template<class T>
    //struct greater
    //{
    //    bool operator()(T a, T b)
    //    {

    //    }
    //};
    //用Compare仿函数代替函数指针
    template <class T, class Container = vector<T>, class Compare = less<T>>
    class priority_queue
    {
    public:
        //构造
        priority_queue()
            :_size(0)
        {}
        template <class InputIterator>
        priority_queue(InputIterator first, InputIterator last)
            : _size(0)
        {
            InputIterator it = first;
            while (it != last)
            {
                this->push(*it);
            }
        }
        //
        bool empty() const;
        size_t size() const;
        //
        T& top() const;
        //
        //向下调整
        
        void push(const T& x)
            
        {
            //找最后一个非叶子节点
            c.push_back(x);
            up_adjust(c);//向上调整建堆
        }
        //
        void pop();
        //
    private:
        //容器
        Container c;
        //比较
        Compare comp;
        int _size;
        //void down_adjust(Container& c)//向下调整
        //{
        //    int child = 1;//左叶子
        //    int parent = 0;
        //    while (child < c.size())//子节点存在
        //    {
        //        //右叶子存在且比左叶子更小/大
        //        if (child + 1 < c.size() && comp(c[child], c[child + 1]))
        //        {
        //            child = child + 1;
        //        }
        //        
        //        if (comp(c[parent], c[child]))
        //        {
        //            swap(c[parent], c[child]);
        //            parent = child;
        //            child = child * 2;
        //            continue;
        //        }
        //        break;
        //    }
        //}
        void up_adjust(Container& c)//向上调整
        {
            int child = c.size() - 1;
            int parent = child / 2;
            while (comp(c[parent], c[child]))
            {
                swap(c[parent], c[child]);
                child = parent;
                parent = child / 2;
                if (child == parent)
                {
                    break;
                }
            }
        }
    };
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/20709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac多媒体影音库:Emby for Mac 中文版

Emby软件是一款功能强大的媒体服务器软件&#xff0c;旨在为用户提供丰富的多媒体体验。以下是关于Emby软件的详细介绍&#xff1a; 下载地址&#xff1a;https://www.macz.com/mac/7964.html?idOTI2NjQ5Jl8mMjcuMTg2LjE1LjE4Mg%3D%3D 主要功能 媒体管理&#xff1a;Emby允许用…

代码随想录-Day25

216.组合总和III 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输…

Python OCR 图片转文字进阶:读光OCR之行检测模型+行识别模型

Python OCR 图片转文字进阶&#xff1a;读光OCR之行检测模型行识别模型 介绍阿里云文字识别OCR&#xff08;读光OCR&#xff09;前置条件模型1&#xff1a;行检测模型模型1&#xff1a;行识别模型 代码&#xff1a;main.py 介绍 什么是OCR&#xff1f; OCR是“Optical Charac…

Leetcode:字符串转换整数 (atoi)

题目链接&#xff1a;8. 字符串转换整数 (atoi) - 力扣&#xff08;LeetCode&#xff09; 普通版本&#xff08;条件限制&#xff09; class Solution { public:int myAtoi(string s) {int res 0;int i 0;int flag 1;//假设整数为正while(s[i] )//跳过空格{i;}if(s[i] …

德人合科技——@天锐绿盾 | -文档透明加密系统

天锐绿盾文档透明加密系统是一种先进的数据安全解决方案&#xff0c;旨在保护企业和组织的敏感信息&#xff0c;防止未经授权的访问和泄漏。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是该系统的一些关键特点和功…

[C++11/14新特性] tuple元组介绍

C11 标准新引入了一种类模板&#xff0c;命名为 tuple&#xff08;中文可直译为元组&#xff09;。tuple 最大的特点是&#xff1a;实例化的对象可以存储任意数量、任意类型的数据。tuple 的应用场景很广泛&#xff0c;例如当需要存储多个不同类型的元素时&#xff0c;可以使用…

3D目标检测入门:探索OpenPCDet框架

前言 在自动驾驶和机器人视觉这两个飞速发展的领域中&#xff0c;3D目标检测技术扮演着核心角色。随着深度学习技术的突破性进展&#xff0c;3D目标检测算法的研究和应用正日益深入。OpenPCDet&#xff0c;这个由香港中文大学OpenMMLab实验室精心打造的开源工具箱&#xff0c;…

加密算法简述

目录 1 加密算法的分类 2 对称加密 3 非对称加密 4 哈希算法 1 加密算法的分类 数据加密的基本过程是将原本的明文数据依照某种算法进行一定的处理&#xff0c;使之成为一段不可读的密文&#xff0c;只有通过相应的密钥与算法进行计算后才可显示出原文。而这个过程中的算法…

【用Python画画】六一儿童节画爱心

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、代码示例三、知识点梳理四、总结 一、前言 本文介绍如何使用Python的海龟画图工具turtle&#xf…

linux中如和查找端口是否被占用

在Linux系统中&#xff0c;可以使用以下命令来查找特定端口是否被占用&#xff1a; 使用netstat命令&#xff1a; netstat -tuln | grep <port_number>其中&#xff0c;-t表示TCP协议&#xff0c;-u表示UDP协议&#xff0c;-l表示监听状态&#xff0c;-n表示显示端口号…

Docker从安装开始精通

从虚拟机到容器 1.环境配置的难题 软件开发最大的麻烦事之一&#xff0c;就是环境配置。用户计算机的环境都不相同&#xff0c;你怎么知道自家的软件&#xff0c;能在那些机器跑起来&#xff1f; 用户必须保证两件事&#xff1a;操作系统的设置&#xff0c;各种库和组件的安装…

堆排序的实现

在上一篇博客中&#xff0c;介绍了堆的实现&#xff0c;现在来介绍一下堆排序。 一.打印有序&#xff1a; 现在先给一个无序的数组&#xff0c;现在我们利用我们实现的堆的功能先完成一下打印排序&#xff1a; 在for循环里是一个建堆的过程&#xff0c;每来一个数据就放入堆中…

c++ map/multimap容器

在C中&#xff0c;std::map 和 std::multimap 是两种关联容器&#xff0c;它们包含了可重复的&#xff08;对于 multimap&#xff09;或唯一的&#xff08;对于 map&#xff09;键值对。这些容器都根据它们的键自动排序&#xff0c;并允许非常快速地根据键查找、插入和删除元素…

监控易监测对象及指标之:深入监测Exchange 2013邮件服务器的关键指标

在当今的信息化时代&#xff0c;Exchange 2013邮件服务器因其高效、稳定的特点被广泛应用于企业通信中。为了确保邮件服务器的持续稳定运行&#xff0c;及时发现并解决潜在问题至关重要。监控易作为一款功能强大的监控工具&#xff0c;为Exchange 2013邮件服务器提供了一系列细…

linux进程的加载和启动过程分析

我们的源代码通过预处理,编译,汇编,链接后形成可执行文件,那么当我们在终端敲下指令$ ./a.out argv1 argv2 后,操作系统是怎么将我们的可执行文件加载并运行的呢? 首先知道,计算机的操作系统的启动程序是写死在硬件上的,每次计算机上电时,都将自动加载启动程序,之后…

python第五次作业

1.请实现一个装饰器&#xff0c;每次调用函数时&#xff0c;将函数名字以及调用此函数的时间点写入文件中 # 导入datetime模块&#xff0c;用于获取当前时间并格式化输出 import datetime# 定义一个装饰器工厂函数log_funcName_time&#xff0c;它接受一个参数time def log_fu…

红外听力教学考试系统-红外语音听力广播在大学英语四六级听力考试中应用

红外听力教学考试系统-红外语音听力广播在大学英语四六级听力考试中的应用 由北京海特伟业科技有限公司任洪卓发布于2024年6月1日 红外语音听力广播&#xff08;即红外听力教学考试系统&#xff09;在英语四六级听力考试的应用正日益凸显出其重要性和优越性。在当前的高等教育…

xcode删除依赖包package,删除不必要的依赖项

点击项目&#xff0c;然后点击PROJECT项里面的Package DepenDependencies&#xff1a; 选中一个依赖项&#xff0c;然后点击减号&#xff0c;就可以把依赖项删除掉了&#xff0c;左侧项目下面的Package已经没有了这个依赖项 TARGET下面的package也要删除&#xff1a;在这里删除…

【C++】【Windows】程序加载DLL库时依次查找哪些目录

搜索的顺序通常如下&#xff1a; 应用程序目录&#xff1a;首先&#xff0c;系统会在包含可执行文件&#xff08;EXE&#xff09;的目录中查找DLL。系统目录&#xff1a;接下来&#xff0c;系统会在Windows系统目录中查找&#xff0c;比如 C:\Windows\System32。16位系统目录&…

人工智能与未来工作:未来已来,你准备好了吗?

1. 引言 随着人工智能技术的飞速发展&#xff0c;它正在逐渐渗透到我们生活的方方面面&#xff0c;尤其是工作领域。本文将探讨人工智能的基本概念&#xff0c;它在不同行业的应用&#xff0c;以及它对未来就业市场和教育体系可能带来的影响。 2. 人工智能的基本概念 2.1 定…