queue的模拟实现【C++】

文章目录

  • 全部的实现代码放在了文章末尾
  • 什么是适配器模式?
  • 准备工作
    • 包含头文件
    • 定义命名空间
    • 类的成员变量
  • 默认成员函数
  • empty
  • size
  • front
  • back
  • push
  • pop
  • 全部代码

全部的实现代码放在了文章末尾

queue的模拟实现和stack一样,采用了C++适配器模式

queue的适配器一般是deque,也可以是list

因为queue是有特殊限制的线性表【只能在队头删除,队尾插入】,所以只要是线性结构并且可以高效的实现头插和尾删的线性表,就都可以作为queue的适配器


什么是适配器模式?

适配器模式是一种设计模式,它允许将不兼容接口的类一起工作

适配器模式通常用于以下情况:

  1. 希望使用一个类,但其接口与其他代码不兼容。
  2. 希望创建一个可重用的类,它能够将接口转换为其他接口。
  3. 希望使用第三方库或遗留代码,但其接口与其他代码不兼容。

适配器模式通常包括以下三个主要部分:

  1. 目标接口(Target):这是期望使用的接口,客户端代码只能与目标接口交互。
  2. 源接口(Adaptee):这是需要适配的类,其接口与目标接口不兼容。
  3. 适配器(Adapter):这是一个类,它实现了目标接口,并将调用转换为对源接口的调用。适配器将源接口的调用转换为目标接口的调用,使得客户端代码可以与目标接口交互。

可以类比我们生活中的家庭电源接口笔记本电脑充电口电源适配器,它们之间也是一种适配器关系

笔记本电脑充电口是上面提到的目标接口
家庭电源接口是上面提到的源接口
电源适配器是上面提到的适配器

笔记本电脑的充电口是不能和家庭电源接口直接连接进行充电的,因为笔记本电脑用的是直流电,而家庭电源输出的是交流电,所以要把交流电转换为直流电才能给笔记本电脑供电,而电源适配器就能做到这一点

对应了上面提到的适配器模式解决的问题:
可以将不兼容接口的类一起工作


准备工作

创建两个文件,一个头文件myqueue.hpp,一个源文件test.cpp

【因为模板的声明和定义不能分处于不同的文件中,所以把成员函数的声明和定义放在了同一个文件myqueue.hpp中】

  1. myqueue.hpp:存放包含的头文件,命名空间的定义,成员函数和命名空间中的函数的定义

  2. test.cpp:存放main函数,以及测试代码


包含头文件

  1. iostream:用于输入输出

  2. list:提供list类型的适配对象

  3. deque: 提供deque类型的适配对象


定义命名空间

在文件myqueue.hpp中定义上一个命名空间myqueue
把stack类和它的成员函数放进命名空间封装起来,防止与包含的头文件中的函数/变量重名的冲突问题


类的成员变量

只有一个,是适配器对象,默认con是deque类型

在这里插入图片描述


默认成员函数

stack类的模拟实现的时候一样
queue的四大默认成员函数:构造函数,拷贝构造函数,析构函数,赋值运算符重载,都不需要手动写使用编译器提供的默认的即可

因为编译器给的默认的这四大成员函数,都有一个特性:
如果类的成员变量是其他类实例化的对象,调用本类的四大默认成员函数的时候,对其他类实例化的对象进行操作时就可以自动调用那个类自己的四大默认成员函数


empty

因为把queue的数据都存储在了适配器对象里面所以判断适配器对象是否为空即可
加const是为了让const修饰的对象也能调用
bool empty()const 
{return _obj.empty();
}

size

因为把queue的数据都存储在了适配器对象里面所以适配器对象的size,就是queue的size加const是为了让const修饰的对象也能调用
size_t size()const
{return _obj.size();
}

front

因为把queue的数据都存储在了适配器对象里面所以适配器对象中的第一个数据,就是队头的数据
T& front()
{return _obj.front();
}const修饰的对象只能调用const修饰的成员函数
const T& front()const
{return _obj.front();
}

back

	因为把queue的数据都存储在了适配器对象里面所以适配器对象中的最后一个数据,就是队尾的数据T& back(){return _obj.back();}const修饰的对象只能调用const修饰的成员函数把返回值改成,const T&类型,防止修改const T& back()const{return _obj.back();}

push

因为  要把  queue的数据都存储在适配器对象里面所以push就是尾插
void push(const T&val)
{_obj.push_back(val);
}

pop

因为把queue的数据都存储在了适配器对象里面所以删除队头,就是适配器对象的头删
void pop()
{_obj.pop_front();
}

全部代码

#include<deque>
#include<list>
#include<iostream>using namespace std;namespace myqueue
{//T是queue里面存储的数据的类型//con是适配器的类型template<class T, class con = deque<T>>class queue{private://使用适配器类 实例化的 适配器对象con _obj;public://因为把queue的数据都存储在了适配器对象里面//所以判断适配器对象是否为空即可bool empty()const {return _obj.empty();}//因为把queue的数据都存储在了适配器对象里面//所以适配器对象的size,就是queue的sizesize_t size()const{return _obj.size();}//因为把queue的数据都存储在了适配器对象里面//所以适配器对象中的第一个数据,就是队头的数据T& front(){return _obj.front();}//const修饰的对象只能调用const修饰的成员函数//把返回值改成,const T&类型,防止修改const T& front()const{return _obj.front();}//因为把queue的数据都存储在了适配器对象里面//所以适配器对象中的最后一个数据,就是队尾的数据T& back(){return _obj.back();}//const修饰的对象只能调用const修饰的成员函数//把返回值改成,const T&类型,防止修改const T& back()const{return _obj.back();}//因为  要把  queue的数据都存储在适配器对象里面//所以push就是尾插void push(const T&val){_obj.push_back(val);}//因为把queue的数据都存储在了适配器对象里面//所以删除队头,就是适配器对象的头删void pop(){_obj.pop_front();}};
}

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

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

相关文章

Java生成四位纯数字并且确保唯一性

背景&#xff1a; 给了我一个需求&#xff0c;由于某些问题原因&#xff0c;需要给属性和数据添加一个code字段&#xff0c;这是给我发的消息 这两个要求其实是同一个需求&#xff0c;就是在创建对象的时候塞入一个unique的code嘛&#xff0c;听起来很简单吧&#xff0c;但是实…

GooglePlay 金融品类政策更新(7月17号)

距离上次政策大更新&#xff08;4月5号&#xff09;才过去了3个月&#xff0c;Google Play又迎来了一次大更新&#xff0c;不得不说Google Play的要求越来越高了。 我们来梳理一下这次GooglePlay针对金融品类更新了哪些政策: 1.要求提供金融产品和服务的开发者必须注册为组织…

Window环境下MySQL管理

1、MySQL服务启用和停止 图形化界面管理 使用键盘组合键&#xff08;Win R&#xff09;打开运行对话框&#xff0c;在对话框中输入services.msc并点击确定。 这里可以看到服务名称为MySQL84并处于正在运行的状态。 选中后右键可以进行暂停、停止、重启等操作。 命令提示符管理…

OpenCV 直方图概念,直方图均衡化原理详解

文章目录 直方图相关概念颜色灰度级作用应用场景 C 使用OpenCV绘制直方图单通道直方图关键代码分析&#xff1a;calcHist函数分析使用OpenCV API来绘制直方图 效果图&#xff1a; 彩色三通道直方图效果图&#xff1a; 直方图均衡化概念均衡化作用均衡化效果均衡化数学原理步骤数…

Linux中进程间通信--匿名管道和命名管道

本篇将会进入 Linux 进程中进程间通信&#xff0c;本篇简要的介绍了 Linux 中进程为什么需要通信&#xff0c;进程间通信的常用方式。然后详细的介绍了 Linux 进程间的管道通信方式&#xff0c;管道通信分为匿名管道和命名管道&#xff0c;本篇分别介绍了其实现的原理&#xff…

基于VMware(虚拟机) 创建 Ubunton24.04

目录 1.设置 root 密码 2. 防火墙设置 2.1 安装防火墙 2.2 开启和关闭防火墙 2.3 开放端口和服务规则 2.4 关闭端口和删除服务规则 2.5 查看防火墙状态 3. 换源 3.1 源文件位置 3.2 更新软件包 1. 设置网络 1. 在安装ubuntu时设置网络 2.在配置文件中修改 2.设置 r…

17_高级进程间通信 UNIX域套接字1

非命名的UNIX域套接字 第1个参数domain&#xff0c;表示协议族&#xff0c;只能为AF_LOCAL或者AF_UNIX&#xff1b; 第2个参数type&#xff0c;表示类型&#xff0c;只能为0。 第3个参数protocol&#xff0c;表示协议&#xff0c;可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STR…

HTTP 缓存

缓存 web缓存是可以自动保存常见的文档副本的HTTP设备&#xff0c;当web请求抵达缓存时&#xff0c;如果本地有已经缓存的副本&#xff0c;就可以从本地存储设备而不是从原始服务器中提取这个文档。使用缓存有如下的优先。 缓存减少了冗余的数据传输缓存环节了网络瓶颈的问题…

MySQL学习之InnoDB引擎,索引

Mysql中的引擎 我们先来看一下MySql提供的有哪些引擎 mysql> show engines; 从上图我们可以查看出 MySQL 当前默认的存储引擎是InnoDB,并且在5.7版本所有的存储引擎中只有 InnoDB 是事务性存储引擎&#xff0c;也就是说只有 InnoDB 支持事务。 查看MySQL当前默认的存储引…

算法力扣刷题记录 五十一【654.最大二叉树】

前言 二叉树篇&#xff0c;继续。 记录 五十一【654.最大二叉树】 一、题目阅读 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。…

套接字编程一(简单的UDP网络程序)

文章目录 一、 理解源IP地址和目的IP地址二、 认识端口号1. 理解 "端口号" 和 "进程ID"2. 理解源端口号和目的端口号 三、 认识协议1. 认识TCP协议2. 认识UDP协议 四、 网络字节序五、 socket编程接口1. socket 常见API2. sockaddr结构&#xff08;1&#…

WebGIS的Web服务概述

WebGIS是互联网技术应用于GIS开发的产物&#xff0c;是现代GIS技术的重要组成部分&#xff0c;其中的Web服务是现代WebGIS的核心技术和重要标志&#xff0c;它集GIS、程序组件和互联网的优点于一身&#xff0c;深刻改变了GIS开发和应用的方式&#xff0c;绕过了本地数据转换和本…

Unity 批处理详讲(含URP)

咱们在项目中&#xff0c;优化性能最重要的一个环节就是合批处理&#xff0c;&#xff0c;在早期Unity中&#xff0c;对于合批的处理手段主要有三种&#xff1a; Static Batching Dynamic Batching GPU Instancing 如今Unity 为了提升合批范围与效率&#xff0c;提供了…

ICT测试原理

目录&#xff1a; 一、什么是ICT 二、ICT在哪使用 三、ICT如何测试 1、隔离(Guarding)原理 2、电容器测试原理 3、电感器测试原理 4、普通二极管测试方法(MODE D) 5、晶体管的测量原理 (三端点)(MODE TR) 6、短/开路的测试原理 1&#xff09;学习短路表 2&#xff…

基于chrome插件的企业应用

一、chrome插件技术介绍 1、chrome插件组件介绍 名称 职责 访问权限 DOM访问情况 popup 弹窗页面。即打开形式是通过点击在浏览器右上方的icon&#xff0c;一个弹窗的形式。 注: 展示维度 browser_action:所有页面 page_action:指定页面 可访问绝大部分api 不可以 bac…

【数据结构】排序算法——Lessen1

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

【动态专修】2024年五菱维修手册和电路图资料更新

经过整理&#xff0c;2017-2024年五菱汽车全系列已经更新至汽修帮手资料库内&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表…

人、智能、机器人……

在遥远的未来之城&#xff0c;智能时代如同晨曦般照亮了每一个角落&#xff0c;万物互联&#xff0c;机器智能与人类智慧交织成一幅前所未有的图景。这座城市&#xff0c;既是科技的盛宴&#xff0c;也是人性与情感深刻反思的舞台。 寓言&#xff1a;《智光与心影》 在智能之…

Python自动化DevOps任务入门

目录 Python自动化DevOps任务入门 一、环境和工具配置 1. 系统环境与Python版本 2. 虚拟环境搭建 3. 必要的库安装 二、自动化部署 1. 使用Fabric进行流式部署 2. 使用Ansible编写部署剧本 三、持续集成和测试 1. 配置CI/CD工具 选择工具 配置工具 构建和测试自动…

【SLAM】最最最简单的直线拟合情形下的多种求解方法

本文我们讨论一个最最最简单情况下的拟合的情形&#xff0c;并尝试使用不同的方法来进行求解。 假如有一组数 x 1 , x 2 , x 3 , . . . , x n x_1,x_2,x_3,...,x_n x1​,x2​,x3​,...,xn​&#xff0c;对应的值为 y 1 , y 2 , y 3 , . . . , y n y_1,y_2,y_3,...,y_n y1​,y2…