C++ STL : 模拟实现STL中的容器适配器priority_queue
目录
- priority_queue
- 文档介绍
- 实现思路
- 思路
- 仿函数
- 实现
priority_queue
文档介绍
文档介绍
- 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。
- 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元 素)。
- 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特 定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。
- 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭 代器访问,并支持以下操作:
- empty():检测容器是否为空
- size():返回容器中有效元素个数
- front():返回容器中第一个元素的引用
- push_back():在容器尾部插入元素
- 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue类实例化指 定容器类,则使用vector。
- 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数 make_heap、push_heap和pop_heap来自动完成此操作。
实现思路
思路
优先级队列priority_queue就是数据结构中的堆, 作为容器适配器,其底层默认使用的容器是连续存储的vector,然后通过向下调整算法将vector调整为堆的结构,所以完全可以服用之前实现heap的代码,只需要在复用原有代码的基础上增加stl的特性即可。
下面是之前数据结构篇章时实现的堆
堆的实现
仿函数
由于C语言不能很好的支持泛型编程,所以当我们实现想分别实现大堆和小堆的时候就得修改其中的代码,但是由于C++具有模板,就完全可以通过仿函数和模板来实现代码的复用。
什么是仿函数? 其实就是使一个类能够像函数一样使用,要做到这一点只需要重载它的()运算符即可,只需要分别实现大小判断的仿函数,就可以做到分别实现大小堆
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;}};
这里的greater是小堆,less是大堆。
实现了之后只需要在模板中传递对应的仿函数即可实现大小堆的选择
库中默认是大堆
实现
#include<vector>namespace lee
{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;}};template <class T, class Container = std::vector<T>, class Compare = less<T> >class priority_queue{public:priority_queue(){}template<class iterator>priority_queue(iterator begin, iterator end) : _con(begin, end){for (int i = (_con.size() - 2) / 2; i >= 0; i--){AdjustDown(i);}}void AdjustUp(size_t child){size_t parent = (child - 1) / 2;while (child > 0){if (_com(_con[parent], _con[child])){std::swap(_con[child], _con[parent]);}else{break;}child = parent;parent = (child - 1) / 2;}}void AdjustDown(size_t root){size_t parent = root;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])){std::swap(_con[child], _con[parent]);}else{break;}parent = child;child = parent * 2 + 1;}}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);}const T& top() const {return _con[0];}bool empty() const{return _con.empty();}size_t size() const{return _con.size();}private:Container _con;Compare _com;};
}
C++ STL : 模拟实现STL中的容器适配器priority_queue相关推荐
- C++ STL : 模拟实现STL中的关联式容器unordered_map/unordered_set
目录 unordered_map/unordered_set unordered_map/unordered_set与map/set的区别 底层哈希桶的改造 仿函数 Key值的获取方法 hash(ke ...
- C++ STL : 模拟实现STL中的容器适配器stack和queue
目录 什么是容器适配器 stack stack的文档介绍-(来自cplusplus) stack的实现 queue queue的文档介绍-(来自cplusplus) queue的实现 什么是容器适配器 ...
- C++ STL : 模拟实现STL中的关联式容器map和set
目录 关联式容器 键值对 底层红黑树的改造 仿函数 红黑树的迭代器 完整代码 set set的文档介绍 set的实现 map map的文档介绍 map的实现 operator[] 完整代码 multi ...
- C++ STL : 模拟实现STL中的list类
文章目录 list list的介绍 list的优缺点 list的迭代器失效问题 实现的接口 节点部分 迭代器部分 list部分 代码实现 list list的介绍 list的文档介绍 list是可以在 ...
- C++ STL : 模拟实现STL中的vector类
文章目录 vector vector的介绍 vector的优缺点 实现时需要注意的细节问题 1. Capacity增长问题 2. memset等函数来带的按字节拷贝问题 3. 深浅拷贝问题 4. 迭代 ...
- C++ STL : 模拟实现STL中的string类
string的文档介绍 string是表示字符序列的类 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作 单字节字符字符串的设计特性. string类是使用c ...
- C++ 容器适配器priority_queue的使用及实现
优先级队列(Priority Queue) 队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素.但是,许多应用需要另一种队列,每次从队列中取出的应是具有最高优先权的元素,这种 ...
- C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)
C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...
- 5.1 c++ STL 容器适配器简介
1. 适配器简介 在详解什么是容器适配器之前,初学者首先要理解适配器的含义. 其实,容器适配器中的"适配器",和生活中常见的电源适配器中"适配器"的含义非常接近 ...
最新文章
- 正则 不区分大小写_为什么要学正则表达式 7
- RxJava 将一组数据每隔一定时间发送出来
- openresty获取nginx原始的请求头内容
- 男人必看,男性排毒同样重要 - 生活至上,美容至尚!
- 【Swift学习】Swift编程之旅---ARC(二十)
- android抽奖动画,Android App中实现简单的刮刮卡抽奖效果的实例详解
- android studio 2.3.1 r丢失,AndroidStudio中 R文件缺失的办法
- 国行 iPhone 12/Pro/Max双卡模式支持5G网络;支付宝推出「晚点付」功能;MySQL 8.0.22 GA|极客头条
- Redis 禁止使用耗时命令和时间复杂度为O(n)的命令
- python选择排序算法_Python - 排序算法
- 使用IDEA创建Android项目
- win7专业版激活方案
- destoon ajax调用,destoon if else 的常见使用方法
- Mac操作系统下重装 Mac os X 系统
- C语言将一个数插入到已排好序的数组中
- FastqC结果简介
- 数据挖掘经典十大算法_对基本概念的理解
- SSD Trim介绍
- TCmalloc (google开源项目核心部分模拟实现)
- 我学习网络管理员的第一步---各个时期的基本要求