存放自定义数据类型的大/小根堆定义

2024-04-01 08:04

本文主要是介绍存放自定义数据类型的大/小根堆定义,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

要将小于(<)运算符重载函数改为适用于小根堆(即最小堆),您需要确保当传入对象的值小于当前对象的值时,函数返回true。这样,当您构建堆时,具有较小值的节点会被放置在较高的层次(即更接近堆顶)。

运算符重载工作方式:
当您已经有一个node类型的对象,并且您试图将它与即将传入的另一个node类型的对象(在这个例子中是cur)进行比较时(主要体现在先传入的已经在对象里,后传入的需要和其比较),C++编译器会查找适用于这两个对象类型的小于(<)运算符的实现。如果您已经在node类中重载了这个运算符,那么编译器就会使用您的重载函数。

bool operator <(const node &cur) const  
{  return dis < cur.dis;  
}

*this(隐式参数)代表当前对象,即调用运算符重载函数的对象。
cur是传递给函数的参数,代表您想要与当前对象进行比较的另一个node对象。
因此,当您比较两个node对象时,比如:

node a{...}; // 假设a已经初始化  
node b{...}; // 假设b已经初始化  
if (a < b) {  // ...  
}

在if (a < b)语句中,a是当前对象(*this)(因为先一步传入),而b是传递给<运算符重载函数的参数cur。重载函数会比较a.dis和b.dis的值,并根据a.dis是否小于b.dis来返回true或false。
在这个例子中,*this(即当前对象)与cur进行比较。
对于小根堆来说,重要的是确保堆顶元素(即堆中dis值最小的元素)始终位于顶部。通过重载小于运算符来确保具有较小dis值的节点在比较时被认为是“较小”的,这是维护小根堆性质的关键。

以下是一个适用于存放结构体的小根堆的比较逻辑

bool operator <(const node &cur) const   
{  return dis < cur.dis;  //如果当前对象的dis值小于传入参数的dis值,函数将返回true
}
//当前对象(即调用这个函数的node对象)就是与新节点(cur)进行比较的现有节点。

这确保了具有较小dis值的节点在堆中会被放置在更高的位置。因此,堆顶元素将始终具有当前堆中的最小dis值,这正是小根堆的特性。

再来一个适用于存放结构体的小根堆的比较逻辑

bool operator <(const node &cur) const     
{    return dis > cur.dis;//如果当前对象的dis值大于传入参数的dis值,函数将返回true
}

其他方法(以小根堆为例):
如果您正在使用std::priority_queue来实现堆,并且希望它作为小根堆,您可以在创建priority_queue时提供一个比较对象或lambda表达式来指定小根堆的行为:

假设 node 类已经定义 :
lambda 表达式定义小根堆

std::priority_queue<node, std::vector<node>, std::function<bool(const node&, const node&)>> minHeap([](const node &a, const node &b) {  return a.dis < b.dis;  
});  

函数对象:

struct cmp{  bool operator()(const node &a, const node &b) const {  return a.dis < b.dis;  }  
};  
priority_queue<node, std::vector<node>,cmp> minHeap;

在上面的代码中,无论是使用lambda表达式还是函数对象CompareDis,我们都指定了当a.dis小于b.dis时,a应该被认为“小于”b,这符合小根堆的性质。

这篇关于存放自定义数据类型的大/小根堆定义的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/866641

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

Regionals 2004 Asia - Beijing Argus 小根堆

点击打开链接 小根堆 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokeni

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre