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的初步介绍

image-20240130191313960

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

  2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)

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

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

  • empty():检测容器是否为空
  • size():返回容器中有效元素个数
  • front():返回容器中第一个元素的引用
  • push_back():在容器尾部插入元素
  1. 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue类实例化指定容器类,则使用vector。

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

1.2priority_queue的使用

image-20240130192200400

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

image-20240130194228894

1.3进一步补全介绍

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

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

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

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

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

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

namespace FunctionObject
{template<class T>class less{public:bool operator()(const T& a, const T& b){return a < b;}};template<class T>class greater{public:bool operator()(const T& a, const T& b){return a > b;}};
}void test1()
{int a = 1;int b = 10;FunctionObject::greater<int> big;//定义一个对象cout << big(a, b) << endl;//只看big(a, b) 跟函数调用长得一样
}int main()
{test1();return 0;
}

image-20240130195912118


3.模拟priority_queue

文件规划和一览

在这里插入图片描述

priority_queue.h:用来实现queue

test.cpp:进行测试

3.1模拟priority_queue(priority_queue.h)

#pragma oncenamespace MyPriority_queue
{template<class T>class less{public:bool operator()(const T& a, const T& b){return a < b;}};template<class T>class greater{public:bool operator()(const T& a, const T& b){return a > b;}};template<class T, class Container = vector<T>, class Compare = less<T>>//默认是大堆class priority_queue{public:void adjust_up(int child){Compare com;int father = (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;}}}void adjust_down(int father){Compare com;int child = 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<iostream>
#include<vector>
#include<queue>
using namespace std;#include"priority_queue.h"int main()
{MyPriority_queue::priority_queue<int> 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<int, vector<int>, MyPriority_queue::greater<int>> pq2;pq2.push(2);pq2.push(6);pq2.push(9);while (!pq2.empty()){cout << pq2.top() << " ";pq2.pop();}cout << endl;return 0;
}

image-20240130210120238


后天开学,今天也是才到学校,正月十五就一人在宿舍过了😭😭😭
到此为止,容器的部分我们大都讲完啦!!!大家敬请期待接下来的知识分享吧!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/488593.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计 | SSM 学生信息管理 教务管理系统(附源码)

1&#xff0c;绪论 随着我国高等教育的发展&#xff0c;数字化校园将成为一种必然的趋势&#xff0c;国内高校迫切需要提高教育工作的质量与效率&#xff0c;学生成绩管理工作是高校信息管理工作的重要组成部分&#xff0c;与国外高校不同&#xff0c;他们一般具有较大规模的稳…

【Docker】初学者 Docker 基础操作指南:从拉取镜像到运行、停止、删除容器

在现代软件开发和部署中&#xff0c;容器化技术已经成为一种常见的方式&#xff0c;它能够提供一种轻量级、可移植和可扩展的应用程序打包和部署解决方案。Docker 是目前最流行的容器化平台之一&#xff0c;它提供了一整套工具和技术&#xff0c;使得容器的创建、运行和管理变得…

Nginx知识笔记

一、前言 首先&#xff0c;我们来看一张关于正向代理和反向代理的图片 简单理解正向代理和反向代理的概念&#xff1a; 正向代理&#xff1a;在客户端配置代理服务器(和跳板机功能类似&#xff0c;比如公司很多机器需要通过跳板机才允许登录&#xff0c;正向代理的典型用途是…

ChatGPT/GPT4科研应用与AI绘图及论文写作

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

AMRT3D数字孪生引擎详解

AMRT 3D数字孪生引擎介绍 AMRT3D引擎是一款融合了眸瑞科技的AMRT格式与轻量化处理技术为基础&#xff0c;以降本增效为目标&#xff0c;支持多端发布的一站式纯国产自研的CS架构项目开发引擎。 引擎包括场景搭建、UI拼搭、零代码交互事件、光影特效组件、GIS/BIM组件、实时数据…

信息矩阵、hessian矩阵与协方差矩阵

文章目录 协方差矩阵联合概率密度hessian矩阵marginalize 本节探讨信息矩阵、hessian矩阵与协方差矩阵的关系&#xff0c;阐明边缘化的原理。 一个简单的示例&#xff0c;如下&#xff1a; 来自 David Mackay. “The humble Gaussian distribution”. In: (2006). 以及手写vio第…

新手想要做好抖音小店,在开店前你需要知道这五点注意事项!

大家好&#xff0c;我是电商小布。 开抖店你说难吗&#xff0c;其实也不难&#xff0c;把需要的材料准备好就可以着手开店。 难的呢&#xff0c;是在小店的运营上边。 所以新手开店想要少出错&#xff0c;少踩坑&#xff0c;一定要提前把店铺的相关注意事项搞清楚。 今天&a…

bisect_left 和 bisect_right 的源码实现及区别解析

哈喽大家好&#xff0c;我是chowley&#xff0c;最近再练二分查找的题&#xff0c;也顺便看了看Python官方的bisect库&#xff0c;这次做一个总结博客。 在 Python 中&#xff0c;bisect_left 和 bisect_right 是两个常用的二分查找函数&#xff0c;用于在已排序的序列中查找元…

鸿蒙LiteOS-M 内核初始化

目录 一、LiteOS-M 初始化内核二、LOS_KernelInit代码分析三、LOS_Start代码解析坚持就有收获 一、LiteOS-M 初始化内核 在LiteOS-M应用程序中&#xff0c;系统初始化如下&#xff1a; /*** brief This is the ohos entry, and you could call this in your main funciton af…

Linux--自定义shell

shell shell就是操作系统提供给用户与操作系统进行交互的命令行界面。它可以理解为一个用户与操作系统之间的接口&#xff0c;用户可以通过输入命令来执行各种操作&#xff0c;如文件管理、进程控制、软件安装等。Shell还可以通过脚本编程实现自动化任务。 常见的Unix系统中使…

【群智能算法转让】一种新的群智能算法||一种超越隐喻的元启发算法||一种基于数学的群智能算法

1、简介 本次全新出推出一个新的基于种群的元启发算法&#xff0c;基于数学中求解非线性方程组的基本思想而开发的&#xff0c;性能不错 新算法转让Q1 top级&#xff08;一种基于数学的超越隐喻的元启发式算法&#xff09; 新的群智能算法转让&#xff0c;新的元启发式算法转…

花生壳内网穿透教程(图文并茂)

目录 前言&#xff1a; 使用教程&#xff1a; 1.注册账号 2.软件下载及安装&#xff1a; 3.账号绑定及花生壳的使用 4.内网穿透的配置&#xff08;重点&#xff09; 4.2 新增映射页面&#xff1a; 4.3 上面几种映射的区别&#xff1a; 4.4 上面TCP类型的区别&#xff1a;…