【C++】queue和priority_queue

在这里插入图片描述

个人主页~


queue和priority_queue

  • 一、queue的介绍和使用
    • 1、queue的介绍
    • 2、queue的使用
    • 3、queue的模拟实现
  • 二、priority_queue的介绍和使用
    • 1、priority_queue的介绍
    • 2、priority_queue的使用
    • 3、priority_queue的模拟实现
  • 三、仿函数
    • 1、仿函数的特征
    • 2、仿函数的使用
  • ex、有关于list反向迭代器

一、queue的介绍和使用

1、queue的介绍

queue详解

队列是一种容器适配器,专门用在先进先出操作中,从容器一端插入元素,另一端提取元素

队列作为容器适配器实现,就是将特定容器封装成其底层容器类,queue提供一组特定的成员函数来访问其元素,元素从队尾入队列,队头出队列

底层容器至少要支持empty判空、size大小、front队头、back队尾、push_back尾插、pop_front头删操作

vector是没有办法满足以上操作的,但deque和list是可以的

2、queue的使用

函数声明接口说明
queue构造空队列
empty检测队列是否为空
size返回队列中有效数字个数
front返回队头元素的引用
back返回队尾元素的引用
push在队尾将元素入队
pop将队头元素出队列
void test_queue()
{std::queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);std::cout << q.size() << std::endl;std::cout << q.back() << std::endl;while (!q.empty()){std::cout << q.front() << " ";q.pop();}
}

在这里插入图片描述

3、queue的模拟实现

namespace little_monster
{template<class T,class Container = std::deque<T>>class queue{public:queue() {}void push(const T& x) {_c.push_back(x); }void pop() {_c.pop_front(); }T& back() {return _c.back(); }const T& back()const {return _c.back(); }T& front() {return _c.front(); }const T& front() const {return _c.front(); }size_t size() const {return _c.size(); }bool empty() const {return _c.empty(); }private:Container _c;};
}

在这里插入图片描述
当然queue的第二个模版参数只能为deque和list,vector是不行的,因为pop_front不是vector的成员
在这里插入图片描述

二、priority_queue的介绍和使用

1、priority_queue的介绍

文档介绍

优先队列priority_queue是一种容器适配器,根据严格的弱排序标准,会变为降序队列

类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素

优先队列被实现为容器适配器,提供一组特定的成员函数来访问其元素,元素从特定容器的尾部弹出

底层容器需要支持empty、size、front、push_back、pop_back操作

标准容器vector、deque满足上述要求,但默认一般为vector

需要支持随机访问迭代器,以便始终在内部保持堆结构,容器适配器在需要时自动调整结构

2、priority_queue的使用

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置都可以考虑使用priority_queue,默认状态下为大堆

函数声明接口说明
priority_queue()/priority_queue(first,last)构造一个空的优先级队列
empty判空
top返回堆顶元素
push在堆中插入元素
pop删除堆顶元素
#include <queue>
#include <functional>//里边有greater比较方式
void TestPriorityQueue()
{// 默认情况下,创建的是大堆,其底层按照小于号比较std::vector<int> v{ 3,2,7,6,0,4,1,9,8,5 };std::priority_queue<int> q1;for (auto& e : v)q1.push(e);// 如果要创建小堆,将第三个模板参数换成greater比较方式std::priority_queue<int, std::vector<int>, std::greater<int>> q2(v.begin(), v.end());while(!q1.empty()){std::cout << q1.top() << " ";q1.pop();}std::cout << std::endl;while(!q2.empty()){std::cout << q2.top() << " ";q2.pop();}std::cout << std::endl;
}

在这里插入图片描述

如果在priority_queue中放自定义类型的数据,用户需要在自定义类型中自己重载符号,就比如说日期类就要重载>、<,按照我们定义的方式进行比较

手感火热做道题
数组中的第K个最大元素

class Solution {
public:int findKthLargest(vector<int>& nums, int k) {// 将数组中的元素先放入优先级队列中priority_queue<int> p(nums.begin(), nums.end());// 将优先级队列中前k-1个元素删除掉for (int i = 0; i < k - 1; ++i) {p.pop();}return p.top();}
};

3、priority_queue的模拟实现

优先级队列就是一个封装好的堆

#pragma once
#include <vector>
namespace little_monster
{template <class T>struct less{bool operator()(const T& left, const T& right){return left < right;}};template <class T>struct greater{bool operator()(const T& left, const T& right){return left > right;}};template<class T, class Container = std::vector<T>, class Compare = less<T>>class priority_queue{public:priority_queue():_c(){}template <class Iterator>priority_queue(Iterator first, Iterator last): _c(first, last){int count = _c.size();int root = ((count - 2) >> 1);for (; root >= 0; root--){AdjustDown(root);}}void push(const T& x){_c.push_back(x);AdjustUp(_c.size() - 1);}void pop(){if (empty())return;std::swap(_c.front(), _c.back());_c.pop_back();AdjustDown(0);}size_t size() const{return _c.size();}bool empty() const{return _c.empty();}const T& top() const{return _c.front();}private:void AdjustDown(int parent){size_t child = 2 * parent + 1;while (child < _c.size()){if (child + 1 < _c.size() && Compare()(_c[child], _c[child + 1])){++child;}if (Compare()(_c[parent], _c[child])){std::swap(_c[child], _c[parent]);parent = child;child = parent * 2 + 1;}elsereturn;}}void AdjustUp(int child){size_t parent = ((child - 1) >> 1);while (child){if (Compare()(_c[parent], _c[child])){std::swap(_c[parent], _c[child]);child = parent;parent = ((child - 1) >> 1);}elsereturn;}}private:Container _c;};
}

在这里插入图片描述

我们自己定义less和greater以控制是大堆还是小堆,封装在一个结构体中,作为priority_queue的第三个模版参数

主要的就是向上调整算法和向下调整算法,与之前C语言学过的一样,稍有改变

三、仿函数

1、仿函数的特征

优先级队列中的less和greater叫做仿函数

重载圆括号运算符:仿函数的核心在于它重载了圆括号"()"运算符,这使得类的实例能够接收参数,并返回一个值

灵活性和状态保存:与普通函数相比,仿函数具有更大的灵活性,因为它可以包含成员变量,这意味着在多次调用仿函数时,它可以保持并更新这些状态信息,从而影响其行为或返回值

2、仿函数的使用

仿函数实际上就是重载括号,使用起来跟函数指针类似,它不仅能够像函数一样被调用,又具有类和对象的特性,像我们之前如果写向上调整算法以及向下调整算法,大堆和小堆是需要到算法中修改代码的,但是有了仿函数就可以直接重载()然后直接调整是less还是greater就好了

ex、有关于list反向迭代器

template<class Iterator, class Ref, class Ptr>
class ReverseIterator
{
public:typedef ReverseIterator<Iterator, Ref, Ptr> Self;ReverseIterator(Iterator it):_it(it){}Self& operator++(){--_it;return *this;}Self& operator--(){++_it;return *this;}Ref operator*(){Iterator cur = _it;return *(--cur);}Ptr operator->(){return &(operator*());}bool operator!=(const Self& s){return _it != s._it;}bool operator==(const Self& s){return _it == s._it;}
private:Iterator _it;
};

对正向迭代器进行封装就可以得到反向迭代器,先有正向再有反向


今日分享就到这里了~

在这里插入图片描述

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

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

相关文章

2020-11-04 求最小与均值输入0结束

缘由编写c语言希望进行一些解释_编程语言-CSDN问答 void 求最小与均值输入0结束() {//缘由https://ask.csdn.net/questions/1102407int x 1, m INT_MAX, n 0, c 0;while (x)cin >> x, (x&&m > x ? m x : 0), n x, (x ? c : 0);cout << "最…

【智路】智路OS air-edge 开发者手册 包管理工具

包管理工具 https://airos-edge.readthedocs.io/zh/latest/airospkg/airospkg.html 功能概述 智路OS包支持部署在智路OS开源版本和智路OS发行版。 智路OS发行版&#xff08;airos distribution&#xff09;是基于智路OS的商业化版本。包括智路OS内核层、系统工具、库、软件…

WPS如何删除表格下的空白页

WPS Office&#xff08;12.1.0.17827&#xff09; ① 鼠标右键&#xff0c;选择段落 ② 行距&#xff1a;固定值&#xff1b;设置值&#xff1a;1磅&#xff1b;取消勾选&#xff0c;确定即可~

Qt与Udp

(1)绑定端口 (2)广播 用udp实现广播通信_udp广播-CSDN博客 数据的发送是面向整个子网的&#xff0c;任何一台在子网中的计算机都可以接收到相同的数据。 如果一台机器希望向其他N台机器发送信息&#xff0c;这时候可以使用UDP的广播。 --------------- 广播地址&#xff1…

《论层次架构及其在软件系统中的应用》写作框架,软考高级系统架构设计师

论文真题 层次架构作为软件系统设计的一种基本模式,对于实现系统的模块化、可维护性和可扩展性具有至关重要的作用。在软件系统的构建过程中,采用层次架构不仅可以使系统结构更加清晰,还有助于提高开发效率和质量。因此,对层次架构的理解和应用是软件工程师必备的技能之一…

C#开发基础之单例模式下的集合数据,解决并发访问读写冲突的问题

1. 前言 在C#中&#xff0c;使用单例模式管理集合数据时&#xff0c;如果多线程同时访问集合&#xff0c;容易产生并发访问的读写冲突问题。单例模式下集合数据的并发访问读写冲突是如何产生的&#xff1f; 单例模式确保一个类在整个应用运行期间只有一个实例&#xff0c;这使…

《华为 eNSP 模拟器安装教程》

1.电脑安装环境要求&#xff1a; 检查电脑是否安装过 eNSP 和依赖软件&#xff0c;如果有&#xff0c;请全部卸载。 安装软件列表&#xff1a; 2.软件安装&#xff1a; 安装 WinPcap&#xff1a; 打开安装包&#xff0c;单击【Next】 单击【I Agree】 单击【Install】 单击【…

supermap iclient3d for cesium场景加载雨雪效果,并加载相应材质

首先新建一个文件夹来存放材质&#xff0c;我选择src/assets/MaterialJson snow.json,复制粘贴,雨雪用一个就行了 {"material": {"id": "DA82AFCB-129A-4E66-995A-9F519894F58D","cullMode": "none","alphaMode"…

OpenCV结构分析与形状描述符(19)查找二维点集的最小面积外接旋转矩形函数minAreaRect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 找到一个包围输入的二维点集的最小面积旋转矩形。 该函数计算并返回指定点集的最小面积边界矩形&#xff08;可能是旋转的&#xff09;。开发者…

prompt实用技巧-AI+Mermaid【酷炫钉钉文档】

AI 新技能&#xff0c;最近 chatGPTo1 发布后模型能力出现了新的跨越&#xff0c;之前模型的一本正经的胡说八道幻想模式&#xff0c;让AI 对待理科推理明显弱于文案的 AGI 的生成。 prompt engineer 工程师程序员的福音 prompt 内容如下&#xff0c; 按照以上格式生成创建公…

2024年华为9月4日秋招笔试真题题解

2024年华为0904秋招笔试真题 二叉树消消乐好友推荐系统维修工力扣上类似的题--K站中转内最便宜的航班 二叉树消消乐 题目描述 给定原始二叉树和参照二叉树(输入的二叉树均为满二叉树&#xff0c;二叉树节点的值范围为[1,1000]&#xff0c;二叉树的深度不超过1000)&#xff0c…

【信创】Linux上图形化多ping工具--gping的编译安装与打包 _ 统信 _ 麒麟 _ 方德

原文链接&#xff1a;【信创】图形化多ping工具gping的编译安装与打包 | 统信 | 麒麟 | 方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在Linux操作系统上使用gping的文章。gping是一款非常实用的命令行工具&#xff0c;它将传统的ping命令进行了可视化改进…

『功能项目』切换职业面板【48】

我们打开上一篇47技能冷却蒙版的项目&#xff0c; 本章要做的事情是切换职业UI面板的功能 首先双击打开Canvas预制体在左上主角面板信息中新建一个button按钮 重命名&#xff08;父物体是按钮Button&#xff0c;子物体Image即可&#xff09; 创建一个Image 设计一下布局 复制三…

窗口嵌入桌面背景层(vb.net,高考倒计时特供版)

开发思路 根据系统生成高考倒计时的具体时间&#xff0c;附加江苏省省统考的时间生成算法&#xff0c;并且用户可以根据实际情况调整前后30天&#xff0c;具有丰富多彩的图片库和强大的自定义功能&#xff0c;效果图见P3 目前程序处于正式版的1.4版本&#xff0c;本程序由本作…

supermap Iclient3d for cesium加载地形并夸大地形

先看效果图 这是没有夸张之前的都江堰 这是夸大五倍后的都江堰 下面展示代码 主要就是加载supermaponline的skt地形然后夸大 <template><div class"PartOneBox"><div id"cesiumContainer"></div></div> </template>…

个人随想-向量数据库,你到底应该选择谁?

随着大模型的新起&#xff0c;vectorstore这1、2年也非常的火。从以前只能用chroma到现在几十种向量数据库&#xff0c;选都选不过来。 以我接触过的很多公司来说&#xff0c;他们去选择向量数据库的时候&#xff0c;很多都和迷茫&#xff0c;不知道应该选择哪个向量数据库&am…

自动驾驶自动泊车场景应用总结

自动泊车技术是当前智能驾驶技术的一个重要分支,其目标是通过车辆自身的感知、决策和控制系统,实现车辆在有限空间内的自主泊车操作。目前自动泊车可分为半自动泊车、全自动泊车、记忆泊车、自主代客泊车四种产品形态,其中, 根据搭载传感器和使用场景的不同,全自动泊车又可…

文本到3D生成

文本到3D生成是一种通过文本描述直接创建三维数字模型的技术。这种技术能够将语言描述转换成可视化的三维模型&#xff0c;使得内容创作者和设计师可以直接从概念阶段跳转到三维可视化&#xff0c;大大加快创作流程并提供更直观的设计和修改过程。 该技术的核心应用之一是基于…

无人直播好帮手,视频指定词语消音,消除违禁词,直播视频录制,音视频分离,分段

1.视频消音功能 一键删除或者静音视频中的词语 2.直播视频录制功能 可同时录制多个平台,多个主播,没有数量限制 3.音视频转码 支持多种音视频格式转换 4.视频频分离 分离视频中的音频和视频 5.视频合并分割 合并和按时间分割视屏 目前正在测试中…如有需要可以先使…

Netty笔记07-粘包与半包(上)

文章目录 前言1. 粘包造成粘包的原因解决粘包的方法 2. 半包造成半包的原因解决半包的方法 粘包现象服务端代码示例客户端代码示例 半包现象现象分析粘包半包滑动窗口MSS 限制Nagle 算法 前言 粘包和半包问题是网络编程中常见的问题&#xff0c;特别是在TCP协议中。通过合理的设…