1. priority_queue 优先队列
1.1 介绍
优先队列听上去是一个队列, 事实上它是一个堆
堆是一棵完全二叉树, 可以分为大顶堆和小顶堆
顾名思义, 大顶堆是指堆中每一个结点都比它的子结点大(如果他有子结点)
头文件: <queue>
定义: priority_queue<数据类型> q;
默认为大顶堆
考虑一种数据结构通常从"增删改查"四个方面
改和查都比较麻烦, 且堆主要用来排序, 故不作讨论
1.1.1 增
为保证完全二叉树的性质, 我们从末尾插入
但这样明显不符合"每一个结点都比它的子结点大"的规则
于是我们将13和19互换
增 完毕
1.1.2 删
我们都是从头部删除元素
但一棵树不能没有根
为保证完全二叉树的性质, 我们把末尾元素作为它的根
但这样明显不符合"每一个结点都比它的子结点大"的规则
于是我们将5和20互换
再将5和17互换
删 完毕
1.2 方法(我喜欢把结构内部的函数叫方法)
以上功能都是在函数内部实现的, 你只需要知道如何操作即可
方法 | 功能 |
---|---|
p.push(x) | 插入元素x |
p.top() | 获取堆顶元素 |
p.pop() | 弹出栈顶元素 |
1.3 例题
最小函数值
算是序列合并的进阶吧
操作系统
有一点点难
建筑抢修
难度还算可以
重点来了
2. 重载运算符
2.1 介绍
重载运算符可以把想要的大部分运算改变
下面是可重载的运算符
下面是不可重载的运算符
.(点) | 成员访问运算符 |
.* ->* | 成员指针访问运算符 |
::(双冒号) | 域运算符 |
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);
感谢观看