C++STL(四)priority_queue的详细用法及仿函数实现

目录

  • 一:🔥介绍
  • 二:🔥priority_queue 的基本操作
  • 三:🔥priority_queue 的原型定义
  • 四:🔥重写仿函数
    • 4.1.仿函数的介绍
    • 4.2.priority_queue仿函数代码示例
  • 五:🔥priority_queue模拟底层实现(堆排序)
  • 总结

一:🔥介绍

  • 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。

  • 在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。

  • 优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。

二:🔥priority_queue 的基本操作

首先,使用priority_queue时需包含头文件:

  • #include <priority_queue>

🔥): 和队列基本操作相同

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

三:🔥priority_queue 的原型定义

template <class T, class Container = vector<T>,  class Compare = less<typename Container::value_type> > 
class priority_queue
  • 模板申明带3个参数:其中 T 为数据类型,Container 为保存数据的容器(适配器),Compare 为元素比较方式。
  • Container必须是用数组实现的容器,比如 vector,deque 等等,但不能用 list。STL里面默认用的是vector。
  • 比较方式默认用operator<,所以如果把后面2个参数缺省的话,优先队列就是大顶堆(降序),队头元素最大。
greater和less是std实现的两个仿函数
类的对象可以像函数一样使用,其实现就是类中实现一个operator()
这个类的对象就有了类似函数的行为,就是一个仿函数类了//降序队列(默认大根堆) 把后面2个参数缺省
priority_queue <int> q;//升序队列(小根堆)
priority_queue <int,vector<int>,greater<int> > q;

四:🔥重写仿函数

4.1.仿函数的介绍

  • 仿函数(Functor)又称为函数对象(Function Object)是一个能行使函数功能的类。仿函数的语法几乎和我们普通的函数调用一样,不过作为仿函数的类,都必须重载 operator() 运算符。因为调用仿函数,实际上就是通过类对象调用重载后的 operator() 运算符。

  • 仿函数的优点
    写一个简单类,除了维护类的基本成员函数外,只需要重载 operator() 运算符 。这样既可以免去对一些公共变量的维护,也可以使重复使用的代码独立出来,以便下次复用。而且相对于函数更优秀的性质,仿函数还可以进行依赖、组合与继承等,这样有利于资源的管理。

  • 简言之:就是一个类,可以定义一些变量,省的使用全局变量,造成命名空间污染

4.2.priority_queue仿函数代码示例

//仿函数 可以像操作函数一样操作对象 因为重载了() 不是什么新语法
template<class T>
class less
{
public:bool operator()(const T& a, const T& b){return a < b;}
};template<class T>
class greater
{
public:bool operator()(const T& x, const T& y){return x > y;}
};

五:🔥priority_queue模拟底层实现(堆排序)

template<class T>
class less
{
public:bool operator()(const T& a, const T& b){return a < b;}
};template<class T>
class greater
{
public:bool operator()(const T& x, const T& y){return x > y;}
};template<class T, class Container = std::vector<T>, class Compare = less<T>>
class priority_queue
{
public:priority_queue() = default;    // 强制生成默认构造函数template <class InputIterator>priority_queue(InputIterator first, InputIterator last){while (first != last){_con.push_back(*first);}//建堆操作for (int i = (_con.size() - 1 - 1) / 2; i >= 0; i--){adjust_down(i);}}//向下调整算法void adjust_down(size_t parent){Compare comfunc;size_t child = parent * 2 + 1;while (child < _con.size()){if (child + 1 < _con.size() && comfunc(_con[child], _con[child + 1])){++child;}if (comfunc(_con[parent], _con[child])){std::swap(_con[parent], _con[child]);parent = child;child = parent * 2 + 1;}else break;}}//向上调整算法void adjust_up(size_t child){Compare comfunc;int parent = (child - 1) / 2;while (child > 0){if (comfunc(_con[parent], _con[child])) std::swap(_con[parent], _con[child]);else break;child = parent;parent = (child - 1) / 2;}}void push(const T& x){_con.push_back(x);adjust_up(_con.size() - 1);}T& top(){return _con[0];}size_t size(){return _con.size();}bool empty(){return _con.empty();}void pop(){std::swap(_con[0], _con[_con.size() - 1]);_con.pop_back();adjust_down(0);}private:Container _con;Compare comp;
};

总结

  • 优先队列到此就作了个小结。如果有任何疑问都可以私信我,希望我们共同进步, 有错误还请在评论区指正!学,无止境。

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

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

相关文章

Recognize Anything: A Strong Image Tagging Model(RAM模型使用方法)

一、RAM模型介绍 这篇论文介绍了一个名为“Recognize Anything Model”&#xff08;RAM&#xff09;的新型基础模型&#xff0c;专用于图像标签识别&#xff08;图像分类&#xff09;。这一模型采用大规模图像-文本配对数据进行训练&#xff0c;无需手动注释&#xff0c;能够在…

关于焊点检测(SJ-BIST)模块实现

关于焊点检测&#xff08;SJ-BIST&#xff09;模块实现 语言 &#xff1a;Verilg HDL 、VHDL EDA工具&#xff1a;ISE、Vivado、Quartus II 关于焊点检测&#xff08;SJ-BIST&#xff09;模块实现一、引言二、焊点检测功能的实现方法&#xff08;1&#xff09; 输入接口&#x…

数据库(28)——联合查询

对于union查询&#xff0c;就是把多次查询的结果合并起来&#xff0c;形成一个新的查询结果集。 语法 SELECT 字段列表 FROM 表A... UNION [ALL] SELECT 字段列表 FROM 表B...; 演示 select * from user where age > 22 union all select * from user where age < 50; u…

oracle linux和ubuntu的区别

Oracle Linux和Ubuntu是两种不同的Linux发行版&#xff0c;它们有一些区别&#xff1a; 背景和支持&#xff1a; Oracle Linux是由Oracle公司开发和支持的&#xff0c;它是基于Red Hat Enterprise Linux (RHEL)的一个分支。Ubuntu是由Canonical Ltd.开发和支持的&#xff0c;它…

【Python机器学习】PCA——特征提取(2)

上一篇写过了用单一最近邻分类器训练后的精度只有0.22. 现在用PCA。想要度量人脸的相似度&#xff0c;计算原始像素空间中的距离是一种相当糟糕的方法。用像素表示来比较两张图像时&#xff0c;我们比较的是每个像素的灰度值与另一张图像对应位置的像素灰度值。这种表示与人们…

Vue3 组合式 API:依赖注入(四)

provide() provide() 函数是用于依赖注入的一个关键部分。这个函数允许你在组件树中提供一个值或对象&#xff0c;使得任何子组件&#xff08;无论层级多深&#xff09;都能够通过 inject() 函数来访问这些值。 import { provide, ref } from vue; export default { setup(…

iOS Universal Links 配置

前言 Universal Links 通用链接&#xff0c;我的理解就是通过点击这个链接&#xff0c;能够打开应用&#xff0c;还可以根据配置的路径和参数跳转到App内指定页面和传递参数。我们做微信QQ登录分享时会要求配置这个链接。网上有很多文章介绍了如何配置&#xff0c;但是每次随便…

力扣经典面试题-旋转链表(Java)

1.题目描述&#xff1a;给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3] 示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k …

python数据分析-连云港石化基地2023年用电量分析

接下来对连云港石化基地2023年用电量进行分析&#xff0c;首先导入数据分析基本的包&#xff1a; import pandas as pd import matplotlib.pyplot as plt# Load the data from the provided Excel files file_path1 data1.xlsx file_path2 data2.xlsxdata1 pd.read_excel(f…

设计模式之观察者模式ObserverPattern(十一)

一、概述 观察者模式 (Observer Pattern) 是一种行为型设计模式&#xff0c;又被称为发布-订阅 (Publish/Subscribe) 模式&#xff0c;它定义了对象之间的一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会自动收到通知并更新…

Leetcode 力扣109. 有序链表转换二叉搜索树 (抖音号:708231408)

给定一个单链表的头节点 head &#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为 平衡 二叉搜索树。 示例 1: 输入: head [-10,-3,0,5,9] 输出: [0,-3,9,-10,null,5] 解释: 一个可能的答案是[0&#xff0c;-3,9&#xff0c;-10,null,5]&#xff0c;它表示所示的高…

arm架构下torch环境的安装(主要是conda,torch,torchvision以及tensorflow)

以前装过arm架构下的深度学习环境还是有点麻烦的&#xff0c;在此记录一下 参考&#xff1a;https://blog.csdn.net/condom10010/article/details/128139401?ops_request_misc&request_id&biz_id102&utm_termorin%E5%B9%B3%E5%8F%B0%E6%9E%B6%E6%9E%84%E9%85%8D%E…

ubuntu22.04防火墙策略

1. 安装和配置UFW 1.1 安装UFW 如果UFW尚未安装&#xff0c;可以使用以下命令进行安装&#xff1a; sudo apt update sudo apt install ufw1.2 启用UFW 启用UFW并允许SSH流量&#xff0c;以防止自己被锁定在系统之外&#xff1a; sudo ufw allow OpenSSH sudo ufw enable2…

2 程序的灵魂—算法-2.2 简单算法举例-【例 2.4】

【例 2.4】求 100 1 - 1/2 - 1/3 … 1/100 算法可表示如下&#xff1a; S1: sigh1 S2: sum1 S3: deno2 S4: sigh(-1)sigh S5: term sigh(1/deno ) S6: termsumterm S7: deno deno 1 S8:若 deno≤100&#xff0c;返回 S4&#xff1b;否则&#xff0c;结束。 double sum 1.0; …

C++11 列表初始化(initializer_list),pair

1. {} 初始化 C98 中&#xff0c;允许使用 {} 对数组进行初始化。 int arr[3] { 0, 1, 2 };C11 扩大了 {} 初始化 的使用范围&#xff0c;使其可用于所有内置类型和自定义类型。 struct Date {int _year;int _month;int _day;Date(int year, int month, int day):_year(year…

线性数据结构-栈

在JavaScript中&#xff0c;栈&#xff08;Stack&#xff09;是一种遵循后进先出&#xff08;Last In First Out, LIFO&#xff09;原则的数据结构。这意味着最后进入栈的元素将会是第一个被移除的元素。栈通常被用于限制线性数据的访问顺序&#xff0c;使得数据的插入和删除操…

【MySQL】(基础篇二) —— MySQL初始用

MySQL初始用 目录 MySQL初始用基本语法约定选择数据库查看数据库和表其它的SHOW 在Navicat中&#xff0c;大部分数据库管理相关的操作都可以通过图形界面完成&#xff0c;这个很简单&#xff0c;大家可以自行探索。虽然Navicat等图形化数据库管理工具为操作和管理数据库提供了非…

简单了解java中的Map集合

Map 1、Map集合概述 java.util.Map<K, V>集合&#xff0c;里面保存的数据是成对存在的&#xff0c;称之为双列集合&#xff0c;我们称之为键值对。而Collection集合中的元素是单个存在的&#xff0c;称之为单列集合。 2、Map集合的特点 1、可以存储两个数据 2、key元…

微信小程序 导航navigation-bar

属性类型默认值必填说明最低版本titlestring否导航条标题2.9.0loadingbooleanfalse否是否在导航条显示 loading 加载提示2.9.0front-colorstring否导航条前景颜色值&#xff0c;包括按钮、标题、状态栏的颜色&#xff0c;仅支持 #ffffff 和 #0000002.9.0background-colorstring…

微信机器人实现OCR识别录入数据

介绍 采用微信的hook插件&#xff0c;然后解析微信发来的数据图片&#xff0c;通过ocr识别 然后将数据落入execl表格中。同时有权限的人可以导出数据表格即可。 流程图 代码片 文本消息处理流程_robot.py elif msg.type 0x01: # 文本消息# 管理员列表dba_user_list [wxid_…