priority_queue的介绍 仿函数

1.priority_queue的介绍

1.优先队列是⼀种容器适配器,根据严格的弱排序标准,它的第⼀个元素总是它所包含的元素中最⼤的。

2.此上下⽂类似于堆,在堆中可以随时插⼊元素,并且只能检索最⼤堆元素(优先队列中位于顶部的元素)

3.优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供⼀组特定的成员 函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。

4.底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类

5.标准容器类vector和deque满⾜这些需求。默认情况下,如果没有为特定的priority_queue类实例化指定容器类, 则使⽤vector。

6.需要⽀持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时⾃动调⽤算法函数 make_heap、push_heap和pop_heap来⾃动完成此操作。

1.2优先级队列的使用

1.3测试代码

这里的建堆一般有两种方式:
(1) 一种是一个一个push进vector容器再进行向上调整建堆
(2) 另一种是直接用迭代器区间构造直接建堆(推荐用这种)

#include<iostream>
using namespace std;
#include<vector>
#include <queue>
#include <functional> // greater算法的头文件
void TestPriorityQueue()
{// 默认情况下,创建的是大堆vector<int> v = { 3,2,7,6,0,4,1,9,8,5 };priority_queue<int> q1; //使用范围for入队列for (auto e : v)q1.push(e);while (!q1.empty()){cout << q1.top() << " ";q1.pop();}cout << endl;// 建小堆,将第三个模板参数换成greater比较方式//迭代器区间构造,直接建堆priority_queue<int, vector<int>, greater<int>> q2(v.begin(), v.end());while (!q2.empty()){cout << q2.top() << " ";q2.pop();}
}

注意:优先级队列默认的大堆,降序排列,如果要升序,就要换仿函数。下图中第三个模板参数就是传仿函数。

使用算法库里的 less 和 greater 算法,需要包含头文件< functional >

2.仿函数

        2.1仿函数的介绍

仿函数也叫函数对象,是一个重载了 运算符operator() 的类或结构体,可以使得类的对象像函数一样使用,通过重载函数调用运算符,仿函数可以实现自定义的操作行为。

2.2 仿函数的简单示例

// 仿函数/函数对象:重载了oparator()的类,类的对象可以像函数一样使用
// operator()特点,参数个数和返回值根据需求确定,不固定,很多样化
class Func
{
public://void operator()() //()函数调用参数列表括号运算//{//	cout << "Func调用" << endl;//}void operator()(int n = 1) //有参{while (n--){cout << "Func调用" << endl;}}
};int main()
{Func f1;f1();//使得对象像函数一样使用f1.operator()(); //显示调用cout << endl;Func f2;f2(3);return 0;
}

3.优先级队列的模拟实现

#pragma once
#include<vector>
namespace bit
{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 , class Compare = myless<T>>class priority_queue{public:priority_queue() = default;  //默认的构造函数来初始化template<class InputIterator>priority_queue(InputIterator first, InputIterator last){while (first != last){_con.push_back(*first);++first;}for (int i = (_con.size() - 1 - 1 ) / 2; i >= 0; i--){adjust_down(i);}}void adjust_up(int child){Compare comfunc;    //这里默认的是less, <  默认建大堆int parent = (child - 1) / 2;while (child > 0){//_con[parent] < _con[child]if (comfunc(_con[parent], _con[child])){swap(_con[parent], _con[child]);child = parent;parent = (child - 1) / 2;}else { break; }}}void adjust_down(int parent){Compare confunc;size_t child = parent * 2 + 1;  // 计算当前父节点的左子节点的索引while (child < _con.size())  // 只要左子节点存在{if (child + 1 < _con.size() && comfunc(_con[child + 1], _con[child])){++child;  // 如果右子节点存在且更大(或更小),则选择右子节点}// 如果父节点的值小于(或大于)子节点的值,进行交换if (confunc(_con[parent], _con[child])){swap(_con[parent], _con[child]);  // 交换父节点和子节点的值parent = child;  // 更新父节点索引为当前子节点索引child = parent * 2 + 1;  // 计算新的左子节点的索引}else { break; }}}void push(const T& x){_con.push_back(x);adjust_up(_con.size() - 1);}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();adjust_down(0);}const T& top(){return _con[0];}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};}

4.测试代码

void test_priority_queue()
{int a[] = { 2,1,7,6,0,4,3,9,8,5 };// 默认是大堆qian::priority_queue<int> q1(a, a+sizeof(a)/sizeof(int));// 小堆qian::priority_queue<int, vector<int>, qian::greater<int>> q2(a, a + sizeof(a) / sizeof(int));cout << "大堆:" << " ";while (!q1.empty()){cout << q1.top() << " ";q1.pop();}cout << endl;cout << "小堆:" << " ";while (!q2.empty()){cout << q2.top() << " ";q2.pop();}cout << endl;}

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

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

相关文章

接口自动化--Postman(1)

Postman介绍 介绍&#xff1a;Postman是一款接口调试工具特点&#xff1a;支持Mac、Windows和Linux下载&#xff1a;Postman官网下载 【黑马客达天下-登录接口调试】 1、获取验证码 需求&#xff1a;使用Postman访问验证码接口&#xff0c;并查看响应结果地址&#xff1a;h…

北斗三号5G遥测终端机系统在水库大坝安全监测应用

一、概述 我国现有水库大坝9.8万余座&#xff0c;是世界上拥有水库大坝最多的国家。这些水库大坝在防洪、发电、供水、灌溉等方面发挥巨大效益的同时&#xff0c;所存在的安全风险不容忽视。大坝安全监测是大坝安全管理的重要内容&#xff0c;是控制大坝风险的重要措施。大坝安…

Spring入门讲解

这里写目录标题 Spring基础概念关键重点主要特性主要优势Spring与Java EE的对比Spring生态系统概述总结 Spring 基础概念 Spring是一个开源的轻量级Java开发框架&#xff0c;它提供了全面的基础设施支持&#xff0c;简化了企业级应用的开发和部署。Spring的核心理念是依赖注入…

Stable Diffusion 必备插件推荐,菜鸟轻松成高手!

前言 一个刚学AI绘画的小菜鸟如何快速成为Stable Diffusion高手&#xff1f;答案就是SD插件。 只要学会使用SD的各种插件&#xff0c;帮你写正向和负向提示词&#xff0c;修复人脸/身体/手指&#xff0c;高清放大图片&#xff0c;指定人物pose&#xff0c;图片微调等等都可以…

合合信息OCR支持30类国内常见票据一站式分类识别,支持医疗发票、数电票识别

合合信息TextIn平台明星产品——国内通用票据识别&#xff0c;重磅更新&#xff01; 产品支持票据类型扩展到23大类、30小类&#xff0c;覆盖场景更全面&#xff0c;同时升级优化了多款票据识别模型&#xff0c;平均识别率较前版本提升11.5%&#xff0c;整体识别速度提升21.9%…

手写mybatis拦截器自动填充数据

文章目录 &#x1f31e; Sun Frame&#xff1a;SpringBoot 的轻量级开发框架&#xff08;个人开源项目推荐&#xff09;&#x1f31f; 亮点功能&#x1f4e6; spring cloud模块概览常用工具 &#x1f517; 更多信息1.将sun-club-subject模块的登录拦截器放到sun-club-common包中…

Prometheus+Grafana保姆笔记(1)——Prometheus+Grafana的安装

Prometheus Grafana 的组合在微服务项目中可以完成许多DevOps任务&#xff0c;它们共同提供了强大的监控和可视化功能。 我们陆续介绍Prometheus Grafana 的相关用法。 首先介绍PrometheusGrafana的安装。 安装 Prometheus Prometheus 是GO写的&#xff0c;并不依赖于 Ja…

HIT CSAPP——程序人生-Hello’s P2P

本文链接&#xff1a;https://blog.csdn.net/QingFeng_0813/article/details/139468749?spm1001.2014.3001.5502 计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 医学与健康学院 学   号 2022110762 班 级 2252003 …

(回溯) LeetCode 47. 全排列||

原题链接 建议先练习&#xff1a;全排列| 一. 题目描述 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&a…

Java流程控制01:用户交互Scanner

本节教学视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p33&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p33&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Scanner 类用于扫描输入文本从字符串中提…

Bug 解决 | 组件库报错、或样式丢失不生效

目录 一、前言 二、版本问题 1、使用 VantUI 的 toast 组件报错&#xff1f; 2、引入 VantUI 组件库后&#xff0c;toast 组件样式丢失了&#xff1f; 3、使用 Ant Design Vue 组件库&#xff0c;启动后显示 antd.css 不存在&#xff1f; 4、Vant UI 组件库引入的 tabs 组…

数据中心安全建设整体解决方案(DOC原件22页)

数据中心的安全体系建设并非安全产品的堆砌&#xff0c;它是一个根据用户具体业务环境、使用习惯、安全策略要求等多个方面构建的一套生态体系&#xff0c;涉及众多的安全技术&#xff0c;实施过程需要涉及大量的调研、咨询等工作&#xff0c;还会涉及到众多的安全厂家之间的协…

LangChain 推出 LangGraph Studio:首款用于可视化、交互和调试复杂代理应用的代理 IDE

嘿&#xff0c;听说了吗&#xff1f;Langchain最近发布了一项重大更新&#xff0c;他们推出了官方Agent IDE&#xff0c;并且免费开放了LangGraph平台。这对于AI开发者来说是个好消息&#xff0c;意味着我们现在有了更强大的工具来构建智能应用。 今天&#xff0c;我们就来分享…

编译自定义Linux内核,使WSL支持访问Windows下USB设备

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ WSL 本身并不支持连接 USB 设备&#xff0c;因此你需要安装开源 usbipd-win 项目。 usbip 可以让你在网络上共享和使用 USB 设备。它由两个主要组件组成&…

一个Indie Hacker的微SaaS技术栈

如今&#xff0c;可用的技术非常多&#xff0c;我们每个月都会看到各种新的 JS 框架发布&#xff0c;有时&#xff0c;如果你一开始没有选择正确的技术堆栈&#xff0c;以后扩展起来就会很困难。因此&#xff0c;在今天的文章中&#xff0c;我将与你分享我用于开发微型 SaaS 的…

分布式存储ceph知识点整理

一、Ceph概述 如何选择存储 底层协议兼容性产品要有定位&#xff0c;功能有所取舍针对特定市场的应用存储被市场认可的存储系统 稳定性是第一位的性能第二数据功能要够用 一&#xff09;存储分类 1、本地存储 本地的文件系统&#xff0c;不能在网络上用。 如&#xff1a;ext3、…

Python图像背景去除

目录 &#x1f381;库的导入 &#x1f380;库的安装 &#x1f381;rembg库去除背景 &#x1f381;效果 &#x1f381;文末彩蛋 今天来介绍一个特别有趣的python库&#xff0c;rembg库&#xff0c;全称是“Remove Background”的缩写&#xff0c;意为“去除背景”&#xff…

内存泄漏工具valgrind初使用

工具下载&#xff1a; sudo apt install valgrind简单使用流程&#xff1a; 编写源文件编译&#xff08;-g方式&#xff09;valgrind使用memcheck工具运行程序 编写文件&#xff1a; #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #i…

Github 2024-08-12 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-08-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3Java项目2JavaScript项目1TypeScript项目1Vue项目1Clojure项目1Dockerfile项目1HTML项目1C项目1Jupyter Notebook项目1Node.js最佳实…

【秋招笔试】2024-08-07-YT游戏(研发岗)-三语言题解(CPP/Python/Java)

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 本次的题目比较典,…