当前位置:
首页 >
C++ STL : 模拟实现STL中的容器适配器priority_queue
发布时间:2024/4/11
46
豆豆
生活随笔
收集整理的这篇文章主要介绍了
C++ STL : 模拟实现STL中的容器适配器priority_queue
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
目录
- priority_queue
- 文档介绍
- 实现思路
- 思路
- 仿函数
- 实现
priority_queue
文档介绍
文档介绍
- empty():检测容器是否为空
- size():返回容器中有效元素个数
- front():返回容器中第一个元素的引用
- push_back():在容器尾部插入元素
实现思路
思路
优先级队列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中的容
- 下一篇: C++ 泛型编程(二):非类型模板参数,