优先队列和重载运算符

一、优先队列(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结构体仍为上面声明的结构体

此段代码效果和以上代码相同

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值