当前位置: 首页 > news >正文

烟台网站备案邢台头条新闻最新

烟台网站备案,邢台头条新闻最新,买网站自己做,创意设计素材文章目录 仿函数优先队列的模拟实现 仿函数 上回我们说到,优先队列的实现需要用到仿函数的特性 让我们再回到这里 这里我们发现他传入的用于比较的东西竟然是一个类模板,而不是我们所见到的函数 我们可以先创建一个类,用于比较大小 struc…

文章目录

    • 仿函数
    • 优先队列的模拟实现

仿函数

上回我们说到,优先队列的实现需要用到仿函数的特性

让我们再回到这里

这里我们发现他传入的用于比较的东西竟然是一个类模板,而不是我们所见到的函数

我们可以先创建一个类,用于比较大小

struct Less
{bool operator()(int x, int y){return x < y;}
};

这里我们创建了一个Less类,并且重载了圆括号,让他比较x<y是否成立

我们可以这样使用

Less ls;
cout << ls(1, 2) << endl;

结果是1

我们单单从cout这一句来看,ls就好像一个函数一样,可以比较1和2的大小,但是实际上是由Less创建的一个对象来比较的

我们把这一句还原

Less ls;
cout << ls(1, 2) << endl;
cout << ls.operator()(1, 2) <<endl;

实际上后面这一句才是原本的样子

如果我们给这个类加上个模板

例如

template<class T>
struct Less
{bool operator()(T x, T y){return x < y;}
};

这样就可以用来比较不止整形的大小了

这样我们就可以在别的类内部通过类模板来传递函数的功能

讲到这我们就明白了,这个仿函数实际上的功能类似于函数指针,是用来传递函数的逻辑的

这样做的好处是我们可以自行定义需要的函数

例如当堆中的数据为自定义类型,通用的less和greater比较就不起作用了,需要自行定义传入了

优先队列的模拟实现

#include <iostream>
using namespace std;
#include <vector>
namespace xu
{template<class T>struct less{bool operator()(const T& left, const T& right){return left < right;}}; // 仿函数的实现template<class T>struct greater{bool operator()(const T& left, const T& right){return left > right;}}; // 仿函数的实现template<class T, class Container = std::vector<T>, class Compare = less<T>>class priority_queue{public:// 创造空的优先级队列priority_queue() : c() {}template<class Iterator>priority_queue(Iterator first, Iterator last): c(first, last){// 将c中的元素调整成堆的结构int count = c.size();int root = ((count - 2) >> 1);for (; root >= 0; root--)AdjustDown(root);}void push(const T& data){c.push_back(data);AdjustUP(c.size() - 1);}void pop(){if (empty())return;swap(c.front(), c.back());c.pop_back();AdjustDown(0);}size_t size()const{return c.size();}bool empty()const{return c.empty();}const T& top()const{return c.front();}private:// 向上调整void AdjustUP(int child){int parent = ((child - 1) >> 1);while (child){if (Compare()(c[parent], c[child])){swap(c[child], c[parent]);child = parent;parent = ((child - 1) >> 1);}else{return;}}}// 向下调整void AdjustDown(int parent){size_t child = parent * 2 + 1;while (child < c.size()){// 找以parent为根的较大的孩子if (child + 1 < c.size() && Compare()(c[child], c[child + 1]))child += 1;// 检测双亲是否满足情况if (Compare()(c[parent], c[child])){swap(c[child], c[parent]);parent = child;child = parent * 2 + 1;}elsereturn;}}private:Container c;};
}
http://www.yayakq.cn/news/181441/

相关文章:

  • pc网站建设建站模板重庆森林百度网盘
  • 自己做网站appWordPress发送邮件按钮
  • 北京企业建网站定制价格网站如何验证登陆状态
  • 南安市城乡住房建设局网站深圳网站设计公司在什么地方
  • 朔州网站建设费用上海装修设计
  • c 网站开发视频教程 高清驾校网站源码下载
  • 接给别人做网站的活定制型网站制作公司
  • vps做网站空间南宁企业网站设计
  • 建设部网站职责划定在线咨询 1 网站宣传
  • 多网站管理网站建设保密协议范本
  • 商业网站在规划与设计时应着重考虑哪些因素做外贸商城网站
  • 苏州市网站建设公司建网站找哪家
  • 射阳做网站的公司装修网站论坛
  • 整站优化外包服务淘宝做的网站会不会过期
  • 外贸营销型网站制作公司东莞网站建设设
  • 85度c蛋糕房网站系统建设软件开发最强的公司
  • 昆明seo网站排名怎么搭建一个电商平台
  • 龙岗公司做网站福建网站设计制作
  • 网站制作多少钱新闻买房子上哪个网站最好
  • 网站的风格指的是什么西双版纳注册公司流程和费用
  • 网站建设项目心得体会全球邮企业邮箱
  • 响应式网站底部菜单栏做团购网站需要什么
  • 企业网站托管有必要吗深圳市手机网站建设怎么样
  • c2c网站开发毕业设计网站在百度的图标显示不正常
  • 湘潭建设网站的公司网络广告营销方案
  • 上海专业做网站电话免费做字体的网站
  • 上海建设工程安全监理网站海南网站建设哪家好
  • 南宁网站建设业务员手机建站永久免费软件
  • 大连做网站绍兴厂商网站空间 流量
  • 泰国做网站金华网站建设系统