priority_queue, 重载运算符

1. priority_queue 优先队列

1.1 介绍

优先队列听上去是一个队列, 事实上它是一个堆
堆是一棵完全二叉树, 可以分为大顶堆和小顶堆
顾名思义, 大顶堆是指堆中每一个结点都比它的子结点大(如果他有子结点)

25
13
17
9
20
5

头文件: <queue>
定义: priority_queue<数据类型> q; 默认为大顶堆
考虑一种数据结构通常从"增删改查"四个方面
改和查都比较麻烦, 且堆主要用来排序, 故不作讨论

1.1.1 增

为保证完全二叉树的性质, 我们从末尾插入

25
13
17
9
20
5
19

但这样明显不符合"每一个结点都比它的子结点大"的规则
于是我们将13和19互换

25
13
17
9
20
5
19

增 完毕

1.1.2 删

我们都是从头部删除元素

13
17
9
20
5
19

但一棵树不能没有根
为保证完全二叉树的性质, 我们把末尾元素作为它的根

13
17
9
20
5
19

但这样明显不符合"每一个结点都比它的子结点大"的规则
于是我们将5和20互换

13
17
9
20
5
19

再将5和17互换

13
17
9
20
5
19

删 完毕

1.2 方法(我喜欢把结构内部的函数叫方法)

以上功能都是在函数内部实现的, 你只需要知道如何操作即可

方法功能
p.push(x)插入元素x
p.top()获取堆顶元素
p.pop()弹出栈顶元素

1.3 例题

序列合并

最小函数值
算是序列合并的进阶吧

操作系统
有一点点难

建筑抢修
难度还算可以


重点来了

2. 重载运算符

2.1 介绍

重载运算符可以把想要的大部分运算改变
下面是可重载的运算符

双目算术运算符+ (加),-(减),*(乘),/(除),% (取模)
关系运算符==(等于),!= (不等于),< (小于),> (大于),<=(小于等于),>=(大于等于)
逻辑运算符(逻辑或),&&(逻辑与),!(逻辑非)
单目运算符+ (正),-(负),*(指针),&(取地址)
自增自减运算符++(自增),–(自减)
位运算符(按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移)
赋值运算符=, +=, -=, *=, /= , % = , &=,
空间申请与释放new, delete, new[ ] , delete[]
其他运算符()(函数调用),->(成员访问),,(逗号),

下面是不可重载的运算符

.(点)成员访问运算符
.* ->*成员指针访问运算符
::(双冒号)域运算符
sizeof长度运算符
?:条件运算符
#预处理符号

2.2 使用方法

用法可以分为在结构体内或结构体外
结构体内:

struct node{
	int a, b;
	node operator * (const node &y) const{
		// 第二个const用到STL库必加(推荐都加上), 第一个const任何情况都要加
		return {a * y.b, b * y.a};
	}
};

结构体外:

 struct node{
 	int a, b;
 };
 int operator + (const node &x, const node &y){
 	// 第二个const必须不加, 第一个const任何情况都要加
 	return x.a + y.b;
 }

2.3 例

定义三个结构体, 每个结构体有三个int类型元素a b c, 结构体存放在set中, 按c从大到小排列

#include <set>
struct node{
	int a, b, c;
	bool operator < (const node &y){
		return c > y.c;
	}
}x, y, z;
set<node> s;
x.c = 3;
y.c = 2;
z.c = 7;
s.insert(x);
s.insert(y);
s.insert(z);


感谢观看
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
priority_queue中对自定义类型进行排序时,可以通过重载运算符来定义比较规则。比如,如果要按照元素值从大到小排序(小顶堆),可以在自定义类型的结构体或类中重载小于运算符(operator<)。例如,定义一个名为MyType的结构体,其中包含一个名为val的整数成员变量,可以重载小于运算符如下: struct MyType { int val; bool operator<(const MyType& other) const { return val > other.val; // 从大到小排序 } }; 然后可以使用以上自定义类型来定义一个priority_queue实例: priority_queue<MyType> pq; 这样,当向priority_queue中插入元素时,会按照自定义的比较规则进行排序。在上述例子中,元素会按照val的值从大到小排序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [关于struct自定义类型的set/priority_queue重载运算符](https://blog.csdn.net/weixin_59534651/article/details/123141614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [一文看懂priority_queue自定义比较函数有几种方法](https://blog.csdn.net/weixin_36389889/article/details/129802998)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C++ sort / priority_queue自定义比较](https://blog.csdn.net/ahundredmile/article/details/126025258)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值