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

模板网站建设 百度西昌手机网站建设成都彩钢顶防水

模板网站建设 百度,西昌手机网站建设成都彩钢顶防水,做oa系统的网站,建网站多少钱建个网站需要怎么做使用 priority_queue 优先级队列与 stack 和 queue 一样,也是一个容器适配器,其底层通过 vector 来实现的。与 stack 和 queue 不同的是,它的第一个元素总是它所包含的元素中最大或最小的一个。 也就是说,优先级队列就是数据结…

使用

priority_queue

优先级队列与 stack 和 queue 一样,也是一个容器适配器,其底层通过 vector 来实现的。与 stack 和 queue 不同的是,它的第一个元素总是它所包含的元素中最大或最小的一个。

也就是说,优先级队列就是数据结构中所说的堆。其通过堆的向上调整算法、向下调整算法等,将其变为一个堆,保证其第一个元素一定为其所包含元素中最大或最小的一个。

priority_queue<int> q;
q.push(9);
q.push(2);
q.push(7);
q.push(1);
q.push(5);while (!q.empty())
{cout << q.top() << " ";q.pop();
}
cout << endl;

模拟实现

基础实现

模拟实现优先级队列就是模拟实现堆,要实现的核心接口为 push() 和 pop() 。(堆的实现详解)

其为适配器,底层利用 vector 来实现。

默认实现为大堆

#include<vector>//大堆
namespace Friend
{template<class T, class Container = vector<T>>class priority_queue{public:bool empty() const{return con.empty();}size_t size() const{return con.size();}const T& top() const{// 返回数组的第一个元素return con.front();}void AdjustUp(int child){int parent = (child - 1) / 2;while (parent >= 0){if (con[parent] < con[child]){std::swap(con[parent], con[child]);child = parent;parent = (child - 1) / 2;}else{break;}}}void AdjustDown(int parent){int child = 2 * parent + 1;while (child < con.size()){if (child + 1 < con.size() && con[child] < con[child + 1]){child++;}if (con[parent] < con[child]){std::swap(con[parent], con[child]);parent = child;child = 2 * parent + 1;}else{break;}}}void push(const T& x){// 在尾部插入一个新数据con.push_back(x);// 将其重新调整为堆AdjustUp(con.size() - 1);}// 删除堆顶的数据void pop(){// 交换堆顶和尾部的数据std::swap(con[0], con[con.size() - 1]);// 删除尾部数据con.pop_back();// 将其重新调整为堆AdjustDown(0);}private:Container con;};
}

仿函数

按照之前的方法,如果要把大堆变为小堆,就要把 AdjustUp( )、AdjustDown( ) 中所有的 ‘<' 变为 ’>'  ,十分麻烦。因此,C++ 中使用仿函数来解决这个问题。

仿函数实际上为类,并非真正的函数。

其通过重载了 ( ) ,来控制大堆、小堆的变化。

template<class T>
class Less
{
public:// x -- i-1  *******  y -- ibool operator()(const T& x, const T& y){return x < y;}
};template<class T>
class Greater
{
public:// x -- i-1  *******  y -- ibool operator()(const T& x, const T& y){return x > y;}
};

由于其调用时像函数调用,因此得名仿函数。

Less<int> less;less(10, 20);
less.operator()(1, 9);Greater<int> greater;greater(10, 20);
greater.operator()(1, 9);

改进

因此,我们对代码进行改进。

namespace Friend
{template<class T, class Container = vector<T>, class Compare = Less<T>>class priority_queue{public:bool empty() const{return con.empty();}size_t size() const{return con.size();}const T& top() const{// 返回数组的第一个元素return con.front();}void AdjustUp(int child){int parent = (child - 1) / 2;while (parent >= 0){// if (con[parent] < con[child])if (com(con[parent], con[child])){std::swap(con[parent], con[child]);child = parent;parent = (child - 1) / 2;}else{break;}}}void AdjustDown(int parent){int child = 2 * parent + 1;while (child < con.size()){// if (child + 1 < con.size() && con[child] < con[child + 1])if (child + 1 < con.size() &&  com(con[child], con[child + 1])){child++;}// if (con[parent] < con[child])if (com(con[parent], con[child])){std::swap(con[parent], con[child]);parent = child;child = 2 * parent + 1;}else{break;}}}void push(const T& x){// 在尾部插入一个新数据con.push_back(x);// 将其重新调整为堆AdjustUp(con.size() - 1);}// 删除堆顶的数据void pop(){// 交换堆顶和尾部的数据std::swap(con[0], con[con.size() - 1]);// 删除尾部数据con.pop_back();// 将其重新调整为堆AdjustDown(0);}private:Container con;Compare com;};
}

大堆时:

Friend::priority_queue<int> q;

如果要变为小堆,则:

Friend::priority_queue<int, vector<int>, Greater<int>> q;

只需通过仿函数的变换就能达到目的。

http://www.yayakq.cn/news/922072/

相关文章:

  • 中国著名的个人网站小程序设计开发公司
  • 深圳营销型网站建设服务商前端做网站商城 购物车怎么做
  • 彩票走势网站怎么做的淘宝网站怎样做
  • 泰州网站建设优化建站马云将来淘汰的十个行业网站建设
  • 做视频网站注意事项成免费crm破解版
  • wordpress手机视频主题天天seo站长工具
  • 上海网站建设过程北京高校线上教学
  • 重庆建网站推广网站改版中
  • 黑龙江省建设银行官网站首页帮公司做网站
  • 网站内容更新用什么郑州包装设计公司都有哪些
  • 福建网站开发公司电话制作公司网站应该考虑什么
  • 交易网站的建设规划怎么样做淘宝优惠券网站
  • 网站建设与维护的不足濮阳网络教育
  • 移动网站在线开发工具360官方网站
  • 中国建设安全协会网站网站开发验收
  • 网站建设业绩仙桃网站定制
  • 网站定制开发多久时间wordpress文章meta
  • wordpress 云备份乐清seo公司推荐
  • 做网站最便宜多少钱响应网站怎么做
  • 高校服务地方专题网站建设如何让wordpress主页不显示文章
  • 互联网行业趋势企业网站优化服务
  • 海川建设公司网站合肥做淘宝网站
  • 沂水网站建设一个网站建设需要多少钱
  • 十里河网站建设小型企业门户网站制作
  • 网站广告出价平台金方时代网站建设
  • 太原网站建设设计乐清网络网站建设
  • 信息图表网站株洲seo优化哪家好
  • 常熟港口建设费申报网站wordpress 无广告视频插件下载
  • 在门户网站上爆光怎么做为什么做网站ppt
  • 巢湖网站建设公司如何做增加网站留存的营销活动