首页 > 知识百科 > 正文

C++初阶:容器队列priority_queue常用接口详解及模拟实现、仿函数介绍原创

介绍完了stack和queue的介绍以及模拟的相关内容后续:C++初阶:容器队列介绍、stack和queue接口常用详解及模拟实现
接下来进行priority_queue的介绍以及模拟:


文章目录

1.priority_queue的介绍和使用1.1priority_queue的初步介绍1.2priority_queue的使用1.3进一步补全介绍2 .仿函数/函数对象讲解3.模拟priority_queue文件规划和一览3.1模拟priority_queue(priority_queue.h)3.2测试(test.cpp)


1.priority_queue的介绍和使用

1.1priority_queue的初步介绍

优先队列是一种容器队列,按照严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的(默认是大堆)

此上下文相似堆< /mark>,在堆中可以随时插入元素,并且只能搜索最大堆元素(优先队列中位于顶部的元素)

优先队列被实现为容器队列,容器队列即将特定容器类封装作为其底层容器类,队列提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。

容器容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持以下操作:

empty():检测容器是否为空size():返回容器中有效元素个数front():容器返回中第一个元素的引用push_back():在容器尾部插入元素

标准容器类vector和deque满足这些需求默认。情况下,如果没有为特定的priority_queue类实例化指定容器类,则使用vector。

需要支持随机访问迭代器,以便始终在内部保持堆结构。容器队列通过在需要时自动调用算法make_heap、push_heap和pop_heap来自动完成此操作。

1.2priority_queue的使用

函数声明接口说明
priority_queue()构造一个空的优先级队列
priority_queue(first,last)构造一个优先级队列,包含范围为[first,last)的元素
empty()检测优先级队列是否为空,是返回true,否则返回false
top()返回优先级队列中最大(最小)元素,即堆顶元素
push(x)在优先级队列中插入元素x
pop()删除优先级队列中最大(最小)元素,即堆顶元素
#include#include<向量>#include<队列>using namespace std;int main(){priority_queue pq;//这里默认是大堆 pq.push(3);pq.push(2);pq.push(6);pq.push(9); while (!pq.empty()){cout << pq.top() << " ";pq.pop();}cout << endl;priority_queue,greater> pq2 ;//这里确定一个类型greater(马上就讲了)pq2.push(3);pq2.push(2);pq2.push(6);pq2.push(9);while (!pq2 .empty()){cout << pq2.top() << " ";pq2.pop();}cout << endl;return 0;}

1.3进一步补全介绍

优先队列(priority_queue)是一个特殊的队列,它根据元素的优先级进行排序,而不是按照它们被插入的顺序。在C++中,优先队列通常使用堆(heap)数据结构来实现,这使得它能够在==O( log n登录 lo< /span>gn )的时间复杂度内对元素进行插入和删除操作,并能够以O(1)的时间复杂度获取队列中的最大(或最小)==元素。

以下是优先队列(priority_queue)的一些重要特性和接口:

构造函数priority_queue< Type, Container, Compare>:创建一个优先队列对象,其中Type是基本类型,Container是底层容器类型(默认为vector),Compare是元素比较的函数对象类型(默认为std::less,用于最大堆)。priority_queue(first,last):使用范围为[first,last)的迭代器构造一个行为优先队列。默认 strong>:默认情况下,优先顺序是最大堆,即最大元素位于堆顶。可以通过自定义比较函数对象来这种行为,从而创建最小堆改变或者基于自定义的优先级规则进行排序。 > 底层实现:在C++中,优先队列通常使用vector或deque作为底层容器,并通过堆算法来维护元素的顺序。

2.仿函数/函数对象讲解

函数对象(Functor)也称为仿函数(Function Object),是C++中的一个重要概念,它是一个行为类似函数的对象,可以被原来的函数来调用。在C++中,函数对象可以以类的形式实现(其实是个类)重载operator()后果,从而可以像函数一样被调用。。 strong>

函数对象可以提供比普通函数更多的灵活和功能,它可以保存状态、带有成员变量、可以在构造函数中接受等参数。函数对象通常用于STL中的算法、容器和队列中,它们可以作为参数传递给算法,用于自定义排序、查找、比较等操作。

< pre>命名空间 FunctionObject{templateclass less{public:bool operator()(const T& a, const T& b){return a < b;}};template<类 T>类更大{public:bool 运算符()(const T& a, const T& b){return a > b;}};}void test1(){int a = 1;int b = 10;FunctionObject::greater big;//定义一个对象 cout << big(a, b) << endl;//只看big(a, b) 跟函数调用长得一样}int main(){test1();return 0;}


3.模拟priority_queue

文件规划和一览

priority_queue.h:用于实现队列

test.cpp:进行测试

3.1模拟priority_queue(priority_queue.h)

#pragma Oncenamespace MyPriority_queue{templateclass less{public:booloperator()(const T& a, const T&b){return a < b;}};templateclassgreater{public:booloperator()(const T& a, const T& b){return a > b;}};template, class Compare = less>//默认是大堆classpriority_queue{public:void adjustment_up (int child){Compare com;intfather = (child - 1) / 2;//得到父节点的索引 while (child > 0)//再向上也只能到0{if (com(_con[father) ], _con[child])){swap(_con[father], _con[child]);child=father;father= (child - 1) / 2;//更新两个节点}else{break;}}}无效调整_down(intfather){比较com;intchild=father*2+1;//假设左孩子增大while(child<_con.size()){if(child+1<_con.size()&&com( _con[child], _con[child + 1]))//右孩子存在且比左孩子大{child++;}if(com(_con[father], _con[child])){swap(_con[father], _con[child]);father=child;child =father * 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];}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;}; }

3.2测试(test.cpp)

#define _CRT_SECURE_NO_WARNINGS 1#include#include#includeusing namespace std;#include"priority_queue.h"int main(){MyPriority_queue::priority_queue pq;//这里默认是大堆 pq.push(3);pq.push(2 );pq.push(6);pq.push(9);while (!pq.empty()){cout << pq.top() << " ";pq.pop();}cout << endl;priority_queue , MyPriority_queue::greater> pq2;pq2.push(2);pq2.push(6);pq2.push(9);while (!pq2.empty()){cout << pq2.top() << " ";pq2.pop();}cout << endl;return 0;}


后天开学,今天也才到学校,大家正月十五就一人在宿舍过了😭😭😭
到了人口这个,容器的部分我们大都讲完了啦!分享吧!!!

C++初阶:容器队列priority_queue常用接口详解及模拟实现、仿函数介绍原创由知识百科栏目发布,感谢您对的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C++初阶:容器队列priority_queue常用接口详解及模拟实现、仿函数介绍原创

Copyright © 2012-2023 普诚元亨工作室 版权所有

*本站部分网页素材及相关资源来源互联网,如有侵权请速告知,我们将会在24小时内删除*

Z-BlogPHP 1.7.3 琼ICP备2022020219号