STL嵌套结构体重载运算符杂篇

前情回顾

标准模板库STL中有一些数据结构的底层实现是一棵树或者其他的数据结构

例如:
优先队列
大顶堆:priority_queue<int> r;(priority_queue<int,vector<int>,less<int>> r;)
小顶堆:priority_queue<int,vector<int>,greater<int>> r;
图 map<int,int> mp;
等... ...

如果直接将结构体类型嵌套进这些数据结构,编译会报错,原因在于这些数据结构在后台实现时是需要通过各自的“比较函数”实现排位的,而结构体中的多个数据会对此过程产生歧义,此时需要对结构体进行“重载运算符操作”,即对它们的“比较函数”进行自定义。

结构体重载运算符

这里给出一种比较容易理解记忆的方法
<定义友元操作类重载函数>

struct lzh
{
    int data;
    int num;

    friend bool operator < (const lzh &a,const lzh &b)
	{
		if(a.data!=b.data) return a.data<b.data;
		else return a.num<b.num;
    }
};

 下面是对上面操作的格式解释

struct 结构体名
{
    结构体内的元素

    friend bool operator 要重载的运算符 (const 结构体名 &a,const 结构体名 &b)
	{
        重载规则
    }
};

其中,“要重载的运算符”是具体数据结构的“比较函数“的运算符(下文会讲到) ;const是增加操作的安全性和稳定性;&是引用,增加效率,用和不用都可以;a,b是代指,可以换做其他变量;重载规则跟常用的sort内的cmp写法类似(STL之sort的cmp自定义排序其实也是运算符的重载)
要注意的是,重载规则中要把所有结构体成员写全,不然可能会有bug。

判断应该重载的运算符

要重载的运算符由数据结构底层实现的“比较函数”决定,上文“要重载的运算符”的位置必须写“比较函数”中的运算符。
要注意的是,“比较函数”中的运算符不一定是实际排序结果的表面的大小逻辑。
例如重载大顶堆优先队列时,应该填的运算符是“<”。原因是它的“比较函数”的运算符是“<”。

 

如果填错符号,则会报错,报错时查看符号修改即可。

简单来说,要定义(例如优先队列)的排序规则时,先确定其“比较函数”的原有运算符,如果想要的排序规则与原来的数据结构相同,那么在写“重载规则”时符号就用这个,否则就把符号相反,而不是按照排序想要的效果取决定符号。

下面是常用的数据结构的运算符

优先队列
大顶堆:priority_queue<int> r; ——“<”
小顶堆:priority_queue<int,vector<int>,greater<int>> r;——“>”


map<int,int> mp;——“<”

补充

大顶堆:priority_queue<int,vector<int>,less<int>> r;
小顶堆:priority_queue<int,vector<int>,greater<int>> r;

为什么大顶堆是less而小顶堆是greater呢?

关于优先队列priority_queue大小根堆、重载操作符的说明 - Halo_run - 博客园 (cnblogs.com)

关于重载运算符的三种方法

优先队列priority_queue的比较函数 - 水郁 - 博客园 (cnblogs.com)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值