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

C++学习:模拟priority_queue

一:仿函数

开始模拟前咱先了解一下仿函数。有了它,我们就可以自己传个代码让优先级队列升序还是降序,自己模拟时也不用在需要升序降序时改代码。这是个很有用的东西。

不写模版也可以,但模版能用在更多地方嘛

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

这里没用class,因为反正都要用的就直接用默认public的struct了。定义时可以看成重载小括号,千万别漏了嗷。接下来用直接像函数一样用就行了,我们来模拟。

二:优先级队列

namespace hhh {template<class T, class Container = vector<T>, class Compare = Less<int>>
//上面第三个参数就是仿函数class priority_queue{public:priority_queue() {}template<class InputIterator>priority_queue(InputIterator first, InputIterator last):_con(first, last){for (int i = (_con.size() - 2) / 2; i >= 0; i--)adjust_down(i);}void adjust_up(int 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(int 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[child], _con[parent])){swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}else break;}}void push(const T& x){_con.push_back(x);adjust_up(_con.size() - 1);}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();adjust_down(0);}const T& top(){return _con[0];}bool empty(){return _con.empty();}size_t size(){return _con.size();}private:Container _con;};
}

这个实现就是用空间适配器,还有堆的思想,没啥难的

感谢你看到这,大家共同进步!

http://www.lryc.cn/news/447348.html

相关文章:

  • 同程旅行对标拼多多:“形似神不似”
  • HOJ网站开启https访问 申请免费SSL证书 部署证书详细操作指南
  • 程序设计基础I-实验4 循环结构之for语句
  • 深入工作流调度的内核
  • vue3中动态引入组件并渲染组件
  • 【艾思科蓝】网络安全的隐秘战场:构筑数字世界的铜墙铁壁
  • 将图片资源保存到服务器的盘符中
  • 数学建模练习小题目
  • 不可错过的10款文件加密软件,企业电脑加密文件哪个软件好用
  • 常用卫星学习
  • 音视频入门基础:FLV专题(3)——FLV header简介
  • python中数据处理库,机器学习库以及自动化与爬虫
  • 2024最新测评:低代码平台在企业复杂应用场景的适用性如何?
  • URL中 / 作为字符串,而不是路径。
  • el-input只能输入指定范围的数字
  • 数据结构编程实践20讲(Python版)—01数组
  • 数据库实验2—1
  • 现代前端框架实战指南:React、Vue.js、Angular核心概念与应用
  • MySQL --用户管理
  • 详解前驱图与PV操作
  • 孩子来加拿大上学真的那么轻松吗?(上)
  • 【算法篇】二叉树类(1)(笔记)
  • 《C++无锁编程:解锁高性能并发的新境界》
  • 系统架构设计师教程 第9章 9.5 软件可靠性测试 笔记
  • 如何使用ssm实现校园体育赛事管理系统的设计与实现+vue
  • CSS 中的文本相关属性(line - height、font、letter - 属性、text - 属性)
  • mobaxterm、vscode通过跳板机连接服务器
  • 鸿萌数据恢复:iPhone 手机被盗后应采取哪些措施?警惕这些骗局
  • 为了学习Python熬夜部署了Jupyter Notebook 6.x
  • docker-文件复制(docker cp:用于在Docker主机和容器之间拷贝文件或目录)