一、优先队列(priority_queue)
优先队列(priority_queue)是一种每个元素都有优先级的一种数据结构,通过二叉堆实现的。
头文件
#include<queue>
声明方法
最简单的声明方法如下:
priority_queue<int>q;
这种声明方法默认的是降序排列,或者说较大的元素在前面,队头为最大的元素。
完整的写法如下:
priority_queue<int,vector<int>,less<int> >q;
这种声明方法和上面的一样,也是较大元素在前。
如果想让较小元素在前,可以使用以下声明方法:
priority_queue<int,vector<int>,greater<int> >q;
这种声明方法声明出来的就是较小元素在前的优先队列了。
增删元素原理
优先队列是通过二叉堆实现的。
添加元素
现有以上降序二叉堆,若要增添元素50,则先将元素50放置于元素30下
此时50大于其父节点,所以与其父节点交换
此时50小于其父节点 ,插入完成。
删除元素
删除元素原理与插入元素类似,都是通过交换完成
例如有以下二叉堆
若删除元素100,则将最后一个元素7移至根处
此时元素7大于其子节点45,交换
此时7仍大于其子节点,继续交换
此时整个二叉堆符合要求,交换完成
因为增删元素需要一层一层交换,所以时间复杂度为其层数,即当有n个元素时,优先队列增删元素时间复杂度为O(log n)
常用函数
常用函数如下:
q.top()//返回队头元素
q.pop()//删除队头元素
q.push()//插入新元素
其中pop()与push()时间复杂度为O(log n),上文提到过
二、重载运算符
重载运算符是对逻辑运算符,算术运算符等一些运算符对于结构体使用的一种重新定义。
重载运算符可以写在结构体声明内
struct st{
int x,y;
friend bool operator<(st a,st,b){
return a.x<b.x;
}
};
这段代码声明了一个有两个成员变量x和y的结构体st,并通过重载运算符定义了当两个st类型数据使用'<'进行比较时,返回值为两个数据x成员变量的比较结果。
struct st{
int x,y;
bool operator<(const st&a)const st&b{
return a.x<b.x;
}
};
上面这样写也一样
在结构体外重载运算符时,可以向下面这么写
st operator<(const st&a,const st&b){
return a.x<b.x;
}
这段代码中st结构体仍为上面声明的结构体
此段代码效果和以上代码相同