【C++】Stack and Queue and Functor

本文是小编巩固自身而作,如有错误,欢迎指出!

本次我们介绍STL中的stack和queue和其相关的一些容器和仿函数

一.stack and queue

1.适配器

stack和queue其实不是真正意义上的容器,而是容器适配器,而容器适配器又是什么呢?

在C++中,容器适配器(Container Adapters)是一种特殊的容器,它们不提供独立的底层数据存储结构,而是基于其他基础容器(如 vector、deque、list)来实现特定的功能和接口。

简单来说就是之前我们学习的时要了解stack和queue的底层是什么,是数组还是队列,同理在c++就考虑他的底层是vector还是list等等

而在官方给的底层是deque

 而deque又是什么呢?

2.deque

全称为“double-ended queue”,即双端队列,是 C++ 标准模板库(STL)中的一种容器。

简单来说deque就是vector和list的缝合产物

通过前面的学习我们都知道,vector的尾插时间复杂度比头插小,而list痛点在于不能随机访问,但deque就解决了这个问题

deque 是一种序列容器,它允许在容器的两端快速插入和删除元素,时间复杂度为 O(1)。与 vector 相比,deque 可以在头部和尾部高效地进行元素的插入和删除操作;与 list 相比,deque 支持随机访问元素。

deque的原理类似下图 

 deque本质其实就是划分一个个个小数组融合成为大数组,其由一个中控数组map操作,而map中储存的就是每个小数组的地址,及其头尾指针等等。

下面是用vector实现的栈和用list实现的队列

#include<vector>
namespace bite
{template<class T>class stack{public:stack() {}void push(const T& x) {_c.push_back(x);}
void pop() {_c.pop_back();}T& top() {return _c.back();}const T& top()const {return _c.back();}size_t size()const {return _c.size();}bool empty()const {return _c.empty();}private:std::vector<T> _c;};
}
#include <list>
namespace bite
{template<class 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:std::list<T> _c;};
}

 

二.priority_queue

1.priority_queue简介

在 C++ 中,priority_queue(优先队列) 是一种特殊的容器适配器,它基于堆(Heap)数据结构实现,提供常数时间访问最大/最小元素的能力(默认最大堆)。

我们看下以下用例

#include<iostream>
#include<queue>
using namespace std;
int main()
{priority_queue<int> pq;pq.push(3);pq.push(5);pq.push(6);pq.push(1);pq.push(9);while (!pq.empty()){cout << pq.top();pq.pop();}return 0;}

 我们看出来这是系统默认的情况(最大堆),那么如果我们自己实现要自己模拟实现想要最小堆建怎么办呢?

我们先看看模拟实现是什么样的

#pragma once
#include<vector>
template<class T>
class Less
{
public:bool operator()(const T& x,const T& y){return x < y;}};
template<class T>
class Greater
{
public:bool operator()(const T& x, const T& y){return x > y;}
};
namespace yiming
{template<class T,class Container=std::vector<T>,class Compare=Less<T>>class priority_queue{public:priority_queue() = default;template <class InputIterator>priority_queue(InputIterator first, InputIterator last):con(first,last){//向下调整建堆for (int i = (con.size() - 1 - 1) / 2;i >= 0;i--){adjust_down(i);}}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];}bool empty()const{return con.empty();}size_t size()const{return con.size();}private:void adjust_up(int child)//向上调整{Compare com;int parent = (child - 1) / 2;while (child > 0){if (com(con[parent], con[child])){swap(con[child], con[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}}void adjust_down(int parent){Compare com;size_t child = parent * 2 + 1;while (child < con.size()){if (child + 1 < con.size() && com(con[child], con[child + 1]))//选出最大的child++child;if (com(con[parent], con[child])){swap(con[parent], con[child]);parent = child;child = parent * 2 + 1;}else{break;}}}private:Container con;};
}

其中我们看到了主要决定这个模拟实现的类型就行这样一个模版

   template<class T,class Container=std::vector<T>,class Compare=Less<T>>

 我们看到通过这个模版的Compare就可以实现建大堆小堆,这里就涉及到一个概念,仿函数

2.仿函数

仿函数(Functor)是C++中一种行为类似函数的对象,通过重载operator()实现。它可以是普通函数指针、类成员函数指针或定义了operator()的类对象。

其实简单来说就是把一个类包装成函数的样子

如上述代码中的

template<class T>
class Less
{
public:bool operator()(const T& x,const T& y){return x < y;}};
template<class T>
class Greater
{
public:bool operator()(const T& x, const T& y){return x > y;}
};

这样就可以通过模版来实现改变建大堆小堆了

三.测试代码

int main()
{
priority_queue <int>pq;pq.push(4);pq.push(5);pq.push(2);pq.push(5);pq.push(6);while (!pq.empty()){cout << pq.top() << " ";pq.pop();}cout << endl;stack<int> st;st.push(1);st.push(3);st.push(4);while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;queue<int>q;q.push(1);q.push(2);q.push(3);q.push(4);while (!q.empty()){cout << q.front()<<" ";q.pop();}return 0;
}

本次分享就到这里结束了,后续会继续更新,感谢阅读!

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

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

相关文章

Python爬虫实战:研究OpenCV技术构建图像数据处理系统

1. 引言 1.1 研究背景 在当今数字化时代,图像作为一种重要的信息载体,广泛存在于各类网站、社交媒体和在线平台中。这些图像数据涵盖了从自然风光、人物肖像到商品展示、新闻事件等丰富内容,为数据分析和模式识别提供了宝贵的资源。随着计算机视觉技术的快速发展,对大规模…

电感矩阵-信号完整性分析

电感矩阵:正如电容矩阵用于存储许多信号路径和返回路径的所有电容量&#xff0c;我们也需要一个矩阵存储许多导线的回路自感和回路互感值。需要牢记的是&#xff0c;这里的电感元件是回路电感。当信号沿传输线传播时&#xff0c;电流回路沿信号路径传输&#xff0c;然后立即从返…

JUC相关知识点总结

Java JUC&#xff08;java.util.concurrent&#xff09;是Java并发编程的核心工具包&#xff0c;提供了丰富的并发工具类和框架。以下是JUC的主要知识点&#xff0c;按难易程度分类&#xff0c;供你参考&#xff1a; 1. 基础概念与工具类 1.1 并发与并行&#xff08;易&#x…

激光频率梳 3D 测量方案革新:攻克光学扫描遮挡,130mm 深孔测量精度达 2um

一、深孔测量的光学遮挡难题在精密制造领域&#xff0c;130mm 级深孔&#xff08;如航空发动机燃油孔、模具冷却孔&#xff09;的 3D 测量长期受困于光学遮挡。传统激光扫描技术依赖直射光束&#xff0c;当深径比超过 10:1 时&#xff0c;孔壁中下部形成大量扫描盲区&#xff0…

clickhouse 中文数据的正则匹配

中文数据的正则匹配 在ClickHouse中,正则匹配通常用于数据的筛选、格式化等操作。以下是一些常用的正则匹配技巧: 1. 匹配中文字符 要匹配中文字符,可以使用以下正则表达式: SELECT * FROM my_table WHERE my_column REGEXP [\\x{4e00}-\\x{9fa5}];这里的 \\x{4e00}-\\…

[驱动开发篇] Can通信进阶 --- CanFD 的三次采样

驱动开发篇] Can通信进阶 --- Can报文的三次采样一、CAN FD的采样次数1.1. 标准规定1.2. 传统标准CAN采样1.3. CAN FD的采样策略1.3.1. 基础采样策略1.4. 配置位置1.5. 常见步骤二、CAN FD与标准CAN在采样机制上的主要区别三、使用建议四. 芯片厂商实现4.1. 实际市面情况4.2. 例…

分布式文件系统06-分布式中间件弹性扩容与rebalance冲平衡

分布式中间件弹性扩容与rebalance冲平衡176_如果宕机的数据节点事后再次重启会发生什么事情&#xff1f;某个之前某个宕机的数据节点DataNode-A又重启后&#xff0c;肯定会再次注册&#xff0c;并进行全量上报的流程&#xff0c;此时&#xff0c;就会导致DataNode-A上的文件副本…

芯祥科技:工业/车规级BMS芯片厂商 规格选型对比

芯祥科技公司专注于工业和车规级BMS芯片&#xff0c;电源芯片及可编程模拟芯片的研发与销售&#xff0c;客户遍及新能源储能&#xff0c;汽车&#xff0c;电脑&#xff0c;服务器及电动工具等领域。并具有创业公司成功经验&#xff0c;平均具有逾17年以上的芯片研发和市场销售经…

莫队基础(Mo‘s algorithm)

莫队算法简介 莫队算法是一种用于高效处理离线区间查询问题的算法&#xff0c;由莫涛&#xff08;Mo Tao&#xff09;在2009年提出。其核心思想是通过对查询区间进行分块和排序&#xff0c;利用前一次查询的结果来减少计算量&#xff0c;从而将时间复杂度优化至接近线性。 莫…

板卡两个ADC,一个JESD204b sync正常,另一个JESD204B同步不上的问题

目录 1.问题来源: 2.问题分析 进一步测试表现: 抓取204B高速链路数据如上所示。 说明不是配置流程的问题 1.问题来源: 在工控机上和部分电脑上面出现时钟锁不住的现象,无法正常使用板卡。 经过分析,发现板卡上有两片ADC,其中一片的ADC的sync信号经过测量,是正常的,…

Android10 系统休眠调试相关

Android10 系统休眠调试相关实时打印休眠日志(实测好像没作用)&#xff1a;echo 1 > /sys/module/printk/parameters/console_suspend查看唤醒锁&#xff1a;cat sys/power/wake_lock msm8953_64:/ # cat sys/power/wake_lock PowerManager.SuspendLockout PowerManagerServ…

一文掌握Bard机器翻译,以及用python调用的4种方式(现已升级为 Gemini)

文章目录一、Bard机器翻译概述1.1. Bard机器翻译介绍1.2 Bard机器翻译的核心特点1.3 技术背景1.4 与同类模型对比二、Bard机器翻译案例2.1 官方 REST API&#xff08;推荐生产&#xff09;2.2 通过Google Cloud API调用2.3 私有化部署方案2.4 开源镜像 PyBard&#xff08;无需 …

Kafka-Eagle 安装

Kafka-Eagle官网 1&#xff09;上传压缩包 kafka-eagle-bin-2.0.8.tar.gz 到集群第一台的/opt/modules 目录 2&#xff09;解压到本地 tar -zxvf kafka-eagle-bin-2.0.8.tar.gz 3&#xff09;将 efak-web-2.0.8-bin.tar.gz 解压至/opt/installs cd kafka-eagle-bin-2.0.8 …

接口请求的后台发起确认

场景讲解做业务开发时经常遇到这些场景&#xff0c;在后端代码执行命中了些业务规则&#xff0c;需要前端用户确认一下再往下执行。示例1&#xff1a;后端判断申请1笔超过5万的资金时会发起监管流程&#xff0c;告诉前端操作用户风险并询问是否确认执行。示例2&#xff1a;数据…

完整学习MySQL

DML 等术语概念 DML&#xff08;Data Manipulation Language&#xff0c;数据操纵语言&#xff09;&#xff1a; DML主要用于插入、更新、删除和查询数据库中的数据。常见的DML语句包括&#xff1a; INSERT&#xff1a;用于向表中插入新的数据行。UPDATE&#xff1a;用于修改…

大模型笔记1——李宏毅《2025机器学习》第一讲

本篇笔记内容1、学习本节课需要的前置知识了解大模型的训练过程&#xff1a;预训练、后训练、强化学习&#xff08;2024年生成式AI导论前8讲&#xff09;了解基础机器学习、深度学习概念&#xff08;如transformer&#xff09;&#xff08;2021年机器学习课程&#xff09;2、本…

CSS scrollbar-width:轻松定制滚动条宽度的隐藏属性

在前端设计中&#xff0c;滚动条往往是一个容易被忽略的细节。默认的滚动条样式常常与页面设计格格不入&#xff0c;尤其是宽度 —— 过宽的滚动条会挤占内容空间&#xff0c;过窄又可能影响用户操作。而 CSS 的scrollbar-width属性&#xff0c;就像一把 “精细的尺子”&#x…

小迪23年-28~31-js简单回顾

前端-js开发 课堂完结后欲复习巩固也方便后续-重游-故写此篇 从实现功能过渡到涉及的相关知识点 知识点 1、 JS 是前端语言&#xff0c;是可以被浏览器“看到”的&#xff0c;当然也可以被修改啊&#xff0c;被浏览器禁用网页的 JS 功能啊之类的。所以一般都是前后端分离开发&…

JavaScript 概述

JavaScript 是一种高级、解释型编程语言&#xff0c;主要用于网页开发&#xff0c;使其具备动态交互功能。它是网页三大核心技术之一&#xff08;HTML、CSS、JavaScript&#xff09;&#xff0c;能够直接嵌入 HTML 页面并在浏览器中执行。核心特性动态弱类型语言 JavaScript 是…

Mermaid流程图可视化系统:基于Spring Boot与Node.js的三层架构实现

什么是Mermaid?系统架构设计 三层架构 overview架构交互流程 核心组件详解 1. Spring Boot后端2. Node.js中间层3. 前端界面 功能实现 1. 节点和关系管理2. 流程图渲染3. 主题切换4. 导出功能 使用指南 启动步骤页面操作 总结与展望 什么是Mermaid? Mermaid流程图可视化系统…