栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++优先队列priority

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++优先队列priority

c++优先队列(自定义比较函数)
    • 方式一:struct重载运算符()
    • 方式二:class重载运算符()
    • 方式三:定义函数
    • 方式四:lambda表达式
    • 方式五:function包装lambda表达式


可以使用现成的
less来定义大顶堆
greater来定义小顶堆

从文档出可以看到,传入的可以是 函数指针或者 函数对象(类对操作符()进行了重载,)

参考链接:函数指针和函数对象
参考链接:decltype

方式一:struct重载运算符()

通过struct重载()操作符,定义了一个函数对象

struct cmp{
   bool operator()(vector&a,vector&b){
       return a[0]>b[0]; 
   }
};
priority_queue,vector>,cmp> q;//小顶堆

这是属于传入 函数对象 的方式

方式二:class重载运算符()

通过class重载()操作符,定义了一个函数对象
注意要加public

class cmp{
        public:
            bool operator()(vector&a,vector&b){
                return a[0]>b[0]; 
            }
        };
priority_queue,vector>,cmp> q;//小顶堆

这是属于传入 函数对象 的方式

方式三:定义函数

首先定义一个比较函数

bool cmp(vector&a,vector&b){
            return a[0]>b[0];
}

decltype()是用于获得函数指针的 类型的。在模板中也要传入它们的类型。
decltype()要传入的是一个对象的地址,因此需要对cmp加取值符,&cmp为对象的地址

因此可以由函数地址cmp 转为函数指针 类型 decltype(&cmp)

priority_queue,vector>,decltype(&cmp)> q;//小顶堆

这是属于传入 函数指针的方式。

方式四:lambda表达式

和方式三 相同,只不过用lambda表达式来定义函数。
同样需要decltype(&cmp) 先将函数地址转为对象地址(&cmp),再转为函数对象的类型

bool cmp=[](vector&a,vector&b){
            return a[0]>b[0];
        };
priority_queue,vector>,decltype(&cmp)> q;//小顶堆

这是属于传入 函数指针的方式。

方式五:function包装lambda表达式

由于function对lambda函数进行了包装 ,cmp本身就是一个对象地址。(function对象)
直接decltype(cmp)获得函数指针 的类型。

function&,vector&)> cmp=[](vector&a,vector&b){
            return a[0]>b[0];
        };
priority_queue,vector>,decltype(cmp)> q;//小顶堆

这是属于传入 函数指针的方式。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/675956.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号