wordpress国外网站,江西南昌网站建设哪家公司好,wordpress 企业站教程,建设工程教育网校目录
⭐前言
✨堆
✨容器适配器
✨仿函数
⭐priority_queue介绍
⭐priority_queue参数介绍
⭐priority_queue使用
⭐priority_queue实现
✨仿函数实现
✨堆的向上调整和向下调整
✨完整代码 ⭐前言
✨堆 堆是一种特殊的树形数据结构#xff0c;通常以二叉树的…
目录
⭐前言
✨堆
✨容器适配器
✨仿函数
⭐priority_queue介绍
⭐priority_queue参数介绍
⭐priority_queue使用
⭐priority_queue实现
✨仿函数实现
✨堆的向上调整和向下调整
✨完整代码 ⭐前言
✨堆 堆是一种特殊的树形数据结构通常以二叉树的形式实现具有特定的排序特性。堆分为两种类型最大堆和最小堆。 具体可以参见这篇文章【数据结构】二叉树-CSDN博客
✨容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总 结)该种模式是将一个类的接口转换成客户希望的另外一个接口。 STL标准库中stack和queue的底层结构
虽然stack和queue中也可以存放元素但在STL中并没有将其划分在容器的行列而是将其称为容器适配器这是因为stack和队列只是对其他容器的接口进行了包装STL中stack和queue默认使用deque比如 ✨仿函数
在 C 中仿函数通常指的是一种行为类似于函数的对象即可以像调用函数那样被调用的对象。这种对象通常包含一些数据成员并且重载了括号运算符 operator()从而允许以函数的方式调用。
看下面这段代码
class Less
{
public:bool operator()(const int x, const int y){return x y;}
};int main()
{Less lesscom;cout lesscom(1, 2) endl;return 0;
}
代码中定义了Less类重载()函数中定义了x、y两个参数当x小于y就返回true否则返回false。 在main函数中创建了Less类的对象如果想要调用重载()常规的调用方法应该是对象名.函数名(参数列表)。但因为重载()函数是可以省略.operator()所以当我们使用这个仿函数对象的时候使用的方法就和调用一个函数一样这就是仿函数的使用。 仿函数的特点 可调用性仿函数通过重载括号运算符 operator() 实现了可调用性使得我们可以像调用普通函数一样调用仿函数对象。状态仿函数可以拥有自己的数据成员状态这意味着每次调用仿函数时它可以访问这些成员变量这与普通的函数不同后者通常不保留状态。多态性由于仿函数是对象它们可以被用作多态的一部分这意味着你可以通过基类指针或引用调用派生类的仿函数对象。 仿函数的用途 算法参数化仿函数可以作为算法的参数使得算法可以根据传入的不同仿函数表现出不同的行为。事件处理在 GUI 编程中可以使用仿函数作为事件处理器当事件发生时调用相应的仿函数对象。模板编程在 C 模板编程中仿函数经常被用作模板参数以实现泛型算法 ⭐priority_queue介绍 priority_queue 是 C 标准库中的一个容器适配器它提供了基于最大堆或最小堆的数据结构来实现优先队列的功能。priority_queue 自动维护元素的排序使得每次插入或删除操作都能保持堆的性质。
priority_queue 底层将vector作为默认容器默认情况下为大堆。
⭐priority_queue参数介绍 template class T, class Container vectorT,class Compare lesstypename Container::value_type
class priority_queue;T: 这是优先队列中存储的元素类型。例如如果存储整数则 T 将是 int。 Container: 这是一个可选的模板参数用来指定底层容器的类型。默认情况下std::priority_queue 使用 std::vectorT 作为其底层容器。但是可以选择任何支持随机访问迭代器的容器类型例如 std::dequeT。请注意底层容器必须支持 push_back 和 pop_back 操作。 Compare: 这也是一个可选的模板参数用来指定元素之间的比较方式。默认情况下使用 std::lesstypename Container::value_type这意味着对于类型 T 的元素将使用 运算符进行比较创建出一个大堆。如果要创建一个最小堆则可以使用 std::greatertypename Container::value_type。
我们其实可以发现 priority_queue使用的是容器适配器模式底层是vector和deque这样支持下标随机访问等操作的容器并且还是要了仿函数 Compare来控制比较逻辑使用lesstypename Container::value_type创建出大堆使用greatertypename Container::value_type 创建出小堆。 priority_queue的一个完整的声明如下 priority_queueint, std::vectorint, std::greaterint minHeap; ⭐priority_queue使用 优先级队列默认使用vector作为其底层存储数据的容器在vector上又使用了堆算法将vector中元素构造成 堆 的结构因此priority_queue就是堆所有需要用到堆的位置都可以考虑使用priority_queue。 注意 默认情况下priority_queue是大堆。 函数声明接口说明priority_queue()/priority_queue(first, last构造一个空的优先级队列empty()检测优先级队列是否为空是返回true否则返回 falsetop()返回优先级队列中最大(最小元素)即堆顶元素push(x)在优先级队列中插入元素xpop()删除优先级队列中最大(最小)元素即堆顶元素 默认情况下priority_queue是大堆。
#include vector
#include queue
#include functional // greater算法的头文件
void TestPriorityQueue()
{// 默认情况下创建的是大堆其底层按照小于号比较vectorint v{3,2,7,6,0,4,1,9,8,5};priority_queueint q1;for (auto e : v)q1.push(e);cout q1.top() endl;// 如果要创建小堆将第三个模板参数换成greater比较方式priority_queueint, vectorint, greaterint q2(v.begin(), v.end());cout q2.top() endl;
} 如果在priority_queue中放自定义类型的数据用户需要在自定义类型中提供 或者 的重载。
class Date
{
public:Date(int year 1900, int month 1, int day 1): _year(year), _month(month), _day(day){}bool operator(const Date d)const{return (_year d._year) ||(_year d._year _month d._month) ||(_year d._year _month d._month _day d._day);}bool operator(const Date d)const{return (_year d._year) ||(_year d._year _month d._month) ||(_year d._year _month d._month _day d._day);}friend ostream operator(ostream _cout, const Date d){_cout d._year - d._month - d._day;return _cout;}
private:int _year;int _month;int _day;
};
void TestPriorityQueue()
{// 大堆需要用户在自定义类型中提供的重载priority_queueDate q1;q1.push(Date(2018, 10, 29));q1.push(Date(2018, 10, 28));q1.push(Date(2018, 10, 30));cout q1.top() endl;// 如果要创建小堆需要用户提供的重载priority_queueDate, vectorDate, greaterDate q2;q2.push(Date(2018, 10, 29));q2.push(Date(2018, 10, 28));q2.push(Date(2018, 10, 30));cout q2.top() endl;
}⭐priority_queue实现
✨仿函数实现
仿函数就是它的对象可以想函数一样去使用本质上是重载了()。
//仿函数//控制大堆
templateclass T
class less
{
public:bool operator()(const T x, const Ty){return x y;}
};//控制小堆
templateclass T
class greater
{
public:bool operator()(const T x, const T y){return x y;}
}; 实际上的使用应该像下面图中第二行那样但是重载之后就省略了。 ✨堆的向上调整和向下调整
大体上的逻辑和堆的实现相同但是使用仿函数控制比较的逻辑使得优先队列不仅对基础数据类型如int有效也对想Date这样的日期类型有效需要重载了和。
//向上调整
void adjust_up(size_t child)
{Compare com;int parent (child - 1) / 2;while (child 0){if (com(_con[parent], _con[child])){swap(_con[child], _con[parent]);child parent;parent (child - 1) / 2;}else{break;}}
}
//向下调整
void adjust_down(size_t parent)
{Compare com;size_t child parent * 2 1;while (child _con.size()){if (child 1 _con.size() com(_con[child], _con[child 1])){child;}if (com(_con[parent], _con[child])){swap(_con[child], _con[parent]);parent child;child parent * 2 1;}else{break;}}
}
✨完整代码
//仿函数//控制大堆templateclass Tclass less{public:bool operator()(const T x, const Ty){return x y;}};//控制小堆templateclass Tclass greater{public:bool operator()(const T x, const T y){return x y;}};//less 控制为大堆templateclass T,class Container vectorT,class Compare lessTclass priority_queue{public://向上调整void adjust_up(size_t child){Compare com;int parent (child - 1) / 2;while (child 0){//if (_con[child] _con[parent])//if (_con[parent] _con[child])if (com(_con[parent], _con[child])){swap(_con[child], _con[parent]);child parent;parent (child - 1) / 2;}else{break;}}}void push(const T x){_con.push_back(x);adjust_up(_con.size()-1) ;}//向下调整void adjust_down(size_t parent){Compare com;size_t child parent * 2 1;while (child _con.size()){//if (child 1 _con.size() _con[child 1] _con[child])//if (child 1 _con.size() _con[child] _con[child 1])if (child 1 _con.size() com(_con[child], _con[child 1])){child;}//if (_con[child] _con[parent])//if (_con[parent] _con[child])if (com(_con[parent], _con[child])){swap(_con[child], _con[parent]);parent child;child parent * 2 1;}else{break;}}}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();adjust_down(0);}bool empty(){return _con.empty();}size_t size(){return _con.size();}const T top(){return _con[0];}private:Container _con;};
____________________
⭐感谢你的阅读希望本文能够对你有所帮助。如果你喜欢我的内容记得点赞关注收藏我的博客我会继续分享更多的内容。⭐ 文章转载自: http://www.morning.rpkl.cn.gov.cn.rpkl.cn http://www.morning.tdxlj.cn.gov.cn.tdxlj.cn http://www.morning.nfbnl.cn.gov.cn.nfbnl.cn http://www.morning.twwts.com.gov.cn.twwts.com http://www.morning.yjknk.cn.gov.cn.yjknk.cn http://www.morning.zdgp.cn.gov.cn.zdgp.cn http://www.morning.rnjgh.cn.gov.cn.rnjgh.cn http://www.morning.hnzrl.cn.gov.cn.hnzrl.cn http://www.morning.kskpx.cn.gov.cn.kskpx.cn http://www.morning.tcfhs.cn.gov.cn.tcfhs.cn http://www.morning.yixingshengya.com.gov.cn.yixingshengya.com http://www.morning.xhlpn.cn.gov.cn.xhlpn.cn http://www.morning.sqlh.cn.gov.cn.sqlh.cn http://www.morning.rwlnk.cn.gov.cn.rwlnk.cn http://www.morning.mpgfk.cn.gov.cn.mpgfk.cn http://www.morning.gfrjs.cn.gov.cn.gfrjs.cn http://www.morning.dhyzr.cn.gov.cn.dhyzr.cn http://www.morning.kzcz.cn.gov.cn.kzcz.cn http://www.morning.rpwm.cn.gov.cn.rpwm.cn http://www.morning.mlwpr.cn.gov.cn.mlwpr.cn http://www.morning.trsmb.cn.gov.cn.trsmb.cn http://www.morning.xhgxd.cn.gov.cn.xhgxd.cn http://www.morning.bsqkt.cn.gov.cn.bsqkt.cn http://www.morning.xrrbj.cn.gov.cn.xrrbj.cn http://www.morning.kpcxj.cn.gov.cn.kpcxj.cn http://www.morning.pgmbl.cn.gov.cn.pgmbl.cn http://www.morning.nmymn.cn.gov.cn.nmymn.cn http://www.morning.zqzzn.cn.gov.cn.zqzzn.cn http://www.morning.pwmpn.cn.gov.cn.pwmpn.cn http://www.morning.atoinfo.com.gov.cn.atoinfo.com http://www.morning.sqfrg.cn.gov.cn.sqfrg.cn http://www.morning.zdxinxi.com.gov.cn.zdxinxi.com http://www.morning.rzmsl.cn.gov.cn.rzmsl.cn http://www.morning.rxydr.cn.gov.cn.rxydr.cn http://www.morning.mfbcs.cn.gov.cn.mfbcs.cn http://www.morning.zknxh.cn.gov.cn.zknxh.cn http://www.morning.nptls.cn.gov.cn.nptls.cn http://www.morning.wglhz.cn.gov.cn.wglhz.cn http://www.morning.njntp.cn.gov.cn.njntp.cn http://www.morning.lwcqh.cn.gov.cn.lwcqh.cn http://www.morning.phlwj.cn.gov.cn.phlwj.cn http://www.morning.glbnc.cn.gov.cn.glbnc.cn http://www.morning.pfntr.cn.gov.cn.pfntr.cn http://www.morning.fnnkl.cn.gov.cn.fnnkl.cn http://www.morning.bytgy.com.gov.cn.bytgy.com http://www.morning.mzqhb.cn.gov.cn.mzqhb.cn http://www.morning.ymfzd.cn.gov.cn.ymfzd.cn http://www.morning.qsy37.cn.gov.cn.qsy37.cn http://www.morning.npbgj.cn.gov.cn.npbgj.cn http://www.morning.grwgw.cn.gov.cn.grwgw.cn http://www.morning.nzzws.cn.gov.cn.nzzws.cn http://www.morning.fmrwl.cn.gov.cn.fmrwl.cn http://www.morning.nrlsg.cn.gov.cn.nrlsg.cn http://www.morning.cwgt.cn.gov.cn.cwgt.cn http://www.morning.bhjyh.cn.gov.cn.bhjyh.cn http://www.morning.ggtgl.cn.gov.cn.ggtgl.cn http://www.morning.cfcpb.cn.gov.cn.cfcpb.cn http://www.morning.bdgb.cn.gov.cn.bdgb.cn http://www.morning.ckwrn.cn.gov.cn.ckwrn.cn http://www.morning.qfths.cn.gov.cn.qfths.cn http://www.morning.gcszn.cn.gov.cn.gcszn.cn http://www.morning.grtwn.cn.gov.cn.grtwn.cn http://www.morning.tsnq.cn.gov.cn.tsnq.cn http://www.morning.qgqck.cn.gov.cn.qgqck.cn http://www.morning.rwjfs.cn.gov.cn.rwjfs.cn http://www.morning.cwjsz.cn.gov.cn.cwjsz.cn http://www.morning.nmfwm.cn.gov.cn.nmfwm.cn http://www.morning.tktcr.cn.gov.cn.tktcr.cn http://www.morning.gmplp.cn.gov.cn.gmplp.cn http://www.morning.wmpw.cn.gov.cn.wmpw.cn http://www.morning.tsyny.cn.gov.cn.tsyny.cn http://www.morning.gqjwz.cn.gov.cn.gqjwz.cn http://www.morning.pamdeer.com.gov.cn.pamdeer.com http://www.morning.rbhcx.cn.gov.cn.rbhcx.cn http://www.morning.nqlx.cn.gov.cn.nqlx.cn http://www.morning.hqxyt.cn.gov.cn.hqxyt.cn http://www.morning.wnnlr.cn.gov.cn.wnnlr.cn http://www.morning.dncgb.cn.gov.cn.dncgb.cn http://www.morning.srky.cn.gov.cn.srky.cn http://www.morning.wcqkp.cn.gov.cn.wcqkp.cn