c++--priority_queue和仿函数

目录

 1.priority_queue

实现:

2.仿函数

priority_queue+仿函数 实现代码


1.priority_queue

       优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的,其实就是个堆,默认是大根堆。

       优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。

简单实现:
#pragma once
#include<iostream>
#include<vector>
using namespace std;
namespace ch
{
    template <class T, class Container = vector<T>>
    class priority_queue
    {
    public:
 
        priority_queue(){}
 
        void adjust_up(int child) //向上调整算法
        {
            size_t parent = (child - 1) / 2;
            while (child > 0)
            {
                if (c[parent] < c[child])
                {
                    swap(c[parent], c[child]);
                    child = parent;
                    parent = (child - 1) / 2;
                }
                else
                {
                    break;
                }
            }
        }
 
        void adjust_down(int parent) //向下调整算法
        {
            size_t child = parent * 2 + 1;
            while (child < c.size())
            {
                if (child + 1 < c.size() && c[child] < c[child + 1])
                {
                    child++;
                }
                if (c[parent] < c[child])
                {
                    swap(c[parent], c[child]);
                    parent = child;
                    child = parent * 2 + 1;
                }
                else
                {
                    break;
                }
            }
        }
 
        template <class InputIterator>
        priority_queue(InputIterator first, InputIterator last)
        {
            while (first != last)
            {
                c.push(*first);
                first++;
            }
 
            for (int i = (c.size() - 1 - 1) / 2; i >= 0; i--) //建堆,时间复杂度为O(N)
            {
                adjust_down(i);
            }
        }
 
        bool empty() const
        {
            return c.empty();
        }
 
        size_t size() const
        {
            return c.size();
        }
 
        const T& top()
        {
            return c[0];
        }
 
        void push(const T& x)
        {
            c.push_back(x);
            adjust_up(c.size() - 1);
        }
 
        void pop()
        {
            swap(c[0], c[c.size() - 1]);
            c.pop_back();
            adjust_down(0);
        }
 
    private:
        Container c;
    };
 
};

引入仿函数实现定义类型时就能决定大小堆 

2.仿函数

    就是定义一个类,类中只有一个重载了()的成员函数,可以有传入参数,需要调用时创建其对象,如:

class Print{

  void operator()(){
       cout<<"hehe"<<endl;
  }

};
int main(){

   Print p;
   p();

}

所以我们写个大于小于逻辑的仿函数,并在创建priority_queue时传入此类即可

priority_queue+仿函数 实现代码

    //小于仿函数
    template<class T>
    class myless {
    public:
        bool operator()(const T& x,const T& y) {
            return x < y;
        }
    };

    //大于仿函数
    template<class T>
    class mygreater {
    public:
        bool operator()(const T& x, const T& y) {
            return x > y;
        }
    };

    template <class T, class Container = vector<T>, class Compare = myless<T> >
    class priority_queue
    {
    public:

        priority_queue() = default;

        template <class InputIterator>
        priority_queue(InputIterator first, InputIterator last) {
            while (first != last) {
                c.push_back(*first);
                first++;
            }
            for (int i = (size()-1-1) / 2; i >= 0; i--) {
                adjust_down(i);
            }
        }

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

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

        const T& top() const {
            assert(!empty());
            return c[0];
        }

        void adjust_up(size_t child) {
            while (child > 0) {
                size_t parent = (child - 1) / 2;
                if (comp(c[parent] , c[child])) {
                    swap(c[parent], c[child]);
                }else {
                    break;
                }
                child = parent;
            }
        }

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

        void adjust_down(size_t parent) {
            size_t child = parent * 2 + 1;
            while (child < size()) {
                if (child + 1 < size() && comp(c[child] , c[child + 1])) {
                    child++;
                }
                if (comp(c[parent] , c[child])) {
                    swap(c[child], c[parent]);
                    parent = child;
                    child = child * 2 + 1;
                }
                else {
                    break;
                }

            }
        }

        void pop() {
            assert(!empty());
            swap(c[0], c[size() - 1]);
            c.erase(c.end()-1);
            adjust_down(0);
        }

    private:

        Container c;
        Compare comp;
    };

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

查看服务器端口是否打开,如何查看服务器端口是否打开

查看服务器端口是否打开&#xff0c;是确保服务器正常运行和网络通信畅通的关键步骤。以下是几个有力的方法&#xff0c;帮助你快速、准确地判断端口状态。 首先&#xff0c;你可以使用telnet命令来检测端口的连通性。telnet是一个网络协议&#xff0c;可以用于远程登录和管理网…

O2O:Offline–Online Actor–Critic

IEEE TAI 2024 paper 加权TD3_BC Method 离线阶段&#xff0c;算法基于TD3_BC&#xff0c;同时加上基于Q函数的权重函数&#xff0c;一定程度上避免了过估计 J o f f l i n e ( θ ) E ( s , a ) ∼ B [ ζ Q ϕ ( s , π θ ( s ) ) ] − ∥ π θ ( s ) − a ∥ 2 \begin…

vue开发网站--对文章详情页的接口内容进行处理

一、需求 接口返回的数据中既包含文字也包含图片&#xff0c;并且需要对图片进行处理&#xff08;设置最大宽度为100%并拼接域名&#xff09; 可以按照以下步骤进行操作&#xff1a; 二、代码 <template><div class"details"><div class"infos…

【Linux取经路】网络套接字编程——初识篇

文章目录 一、端口号1.1 认识端口号1.2 端口号 VS 进程 PID 二、认识 TCP 协议三、认识 UDP四、网络字节序列五、socket 编程接口5.1 常用 API5.2 sockaddr 结构 六、结语 一、端口号 网络通信的本质是应用层软件进行数据的发送和接受&#xff0c;软件在启动之后&#xff0c;本…

使用C++实现YOLO图像分类:从环境搭建到性能评估的完整指南

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

python的优势有哪些?

python的优点很多&#xff0c;下面简单地列举一些&#xff1a; 简单 Python的语法非常优雅&#xff0c;甚至没有像其他语言的大括号&#xff0c;分号等特殊符号&#xff0c;代表了一种极简主义的设计思想。阅读Python程序像是在读英语。 易学 Python入手非常快&#xff0c;学习…

如何打造不一样的景区文旅VR体验馆项目?

近年来影院类产品迅速火爆&#xff0c;市面上的产品越来越多&#xff0c;投资者可以说是挑花了眼。为了助力投资者实现持续盈利&#xff0c;今天来给大家分析目前普乐蛙大爆新品悬空球幕飞行影院与其他5D/7D影院有哪些区别&#xff0c;给大家的创业投资之路避避雷~ 那我们正式开…

将现有web项目打包成electron桌面端教程(一)vue3+vite+js版

说明&#xff1a;后续项目需要web端和桌面端&#xff0c;为了提高开发效率&#xff0c;准备直接将web端的代码打包成桌面端&#xff0c;在此提前记录一下demo打包的过程&#xff0c;需要注意的是vue2或者vue3vitets或者vue-cli的打包方式各不同&#xff0c;如果你的项目不是vue…

GitHub飙升!京东认证的“Python编程入门三剑客”究竟好在哪?

Python凭借着简单易学、功能强大&#xff0c;已经跃居TIOB编程语言榜首&#xff0c;并且已经开始了它的霸榜之旅。如何选择一套适合自己的Python学习教程&#xff0c;是每个Python爱好者面临的首要问题。 今天给小伙伴们带来的是图灵&京东认证的“Python编程入门三剑客”&…

搜维尔科技:Varjo XR-4功能详解:由凝视驱动的XR自动对焦相机系统

Varjo是XR市场中拥有领先技术的虚拟现实设备供应商&#xff0c;其将可变焦距摄像机直通系统带入到虚拟和混合现实场景中。在本篇文章中&#xff0c;Varjo的技术工程师维尔蒂莫宁详细介绍了这项在Varjo XR-4焦点版中投入应用的技术。 对可变焦距光学系统的需求 目前所有其他XR头…

openh264 自适应量化功能源码分析

openh264 OpenH264是一个开源的H.264/AVC视频编解码器&#xff0c;由Cisco公司发起并贡献了最初的代码基础。它提供了一个用于视频编码和解码的库&#xff0c;支持H.264视频压缩标准&#xff0c;广泛应用于视频会议、流媒体和视频存储等领域。OpenH264是实现H.264编解码功能的…

纷享销客安全体系:物理与环境安全

纷享销客的物理设备托管在经过严格准入制度授权的TIER3级别以上的专业数据中心&#xff0c;这些数据中心均通过了等保三级与IS027001安全认证&#xff0c;确保电力、制冷等基础设施提供相应级别的冗余&#xff0c;以增强IDC环境的安全性。 业务操作系统平台采用当前广泛使用的…

某h5st逆向分析

具体网址经过了base64处理 aHR0cHM6Ly9zby5tLmpkLmNvbS93YXJlL3NlYXJjaC5hY3Rpb24/a2V5d29yZD0lRTklOTklQTQlRTYlQjklQkYlRTYlOUMlQkEmc2VhcmNoRnJvbT1ob21lJnNmPTE1JmFzPTA 要做的是一个搜索的功能具体如图所示。 这里发现携带的参数中存在一个token还有一个加密参数&#x…

【Text2SQL 论文】How to prompt LLMs for Text2SQL

论文&#xff1a;How to Prompt LLMs for Text-to-SQL: A Study in Zero-shot, Single-domain, and Cross-domain Settings ⭐⭐⭐⭐ arXiv:2305.11853, NeurlPS 2023 Code: GitHub 一、论文速读 本文主要是在三种常见的 Text2SQL ICL settings 评估不同的 prompt constructio…

node.js漏洞——

一.什么是node.js 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基于 Google 的 V8 引擎&#xff0c;V8 引擎执行 Javascript 的速度非常…

5-Django项目--分页与搜索(资产页面)

目录 views/asset_data.py asset_data/asset_data.html 搜索与分页笔记: 搜索 整数搜索 字符串搜索 分页 views/asset_data.py # -*- coding:utf-8 -*- from django.shortcuts import render, redirect, HttpResponse from django.utils.safestring import mark_safe f…

redis安裝启动

1、下载redis解压 https://github.com/tporadowski/redis/releases 2、打开cmd&#xff0c;切换到解压的文件夹 3、redis-server.exe redis.windows.conf 启动redis redis可通过命令行输入config set requirepass password和直接修改redis.config文件中修改 requirepass 来设…

usb的hid报表描述符的数据含义详解

报表描述符组成基本单元item 项目编码有二种&#xff1a;短项目和长项目&#xff0c;长项目仅是保留给未来使用&#xff0c;所以不作介绍。下面是短item时&#xff0c;最后一个字节描述了item种类和尺寸 长item格式如下&#xff1a; 短格式如下 bSize &#xff1a;代表后面的…

kotlin 调用java的get方法Use of getter method instead of property access syntax

调用警告 Person.class public class Person {private String name;Person(String name) {this.name name.trim();}public String getName() {return name;}public void setName(String name) {this.name name;}public String getFullName() {return name " Wang&quo…

PasteCode系列系统说明

定义 PasteCode系列是指项目是基于PasteTemplate构建的五层以上项目&#xff0c;包括不仅限于 Domain EntityFrameworkCore Application.Contracts Application HttpApi.Host 熟悉ABP vNext就很好理解了&#xff0c;因为PasteTemplate就是基于ABP的框架精简而来&#xff01;在…