C++初阶:容器适配器介绍、stack和queue常用接口详解及模拟实现

介绍完了list类的相关内容后:C++初阶:适合新手的手撕list(模拟实现list)
接下来进入新的篇章,stack和queue的介绍以及模拟:


文章目录

  • 1.stack的初步介绍
  • 2.stack的使用
  • 3.queue的初步介绍
  • 4.queue的使用
  • 5.容器适配器
    • 5.1含义
    • 5.2STL标准库中stack和queue的底层结构
  • 6.模拟stack和queue
    • 文件规划和一览
    • 6.1模拟stack(stack.h)
    • 6.2模拟queue(queue.h)


1.stack的初步介绍

image-20240130150337781

  1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。

  2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。

  3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下

操作:

  • empty:判空操作

  • back:获取尾部元素操作

  • push_back:尾部插入元素操作

  • pop_back:尾部删除元素操作

  1. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque

Snipaste_2023-12-21_19-43-35


2.stack的使用

1

函数说明
stack()构造空的栈
empty()检测stack是否为空
size()返回stack中元素的个数
top()返回栈顶元素的引用
push()将元素val压入stack中
pop()将stack中尾部的元素弹出
#include<iostream>
#include<stack>
using namespace std;int main()
{stack<int> st;//一个空栈st.push(1);st.push(2);st.push(3);//push进去3个while (!st.empty())//当st不空进循环{cout << st.top() << endl;//输出栈顶元素st.pop();//栈顶出栈}//遍历结束}

image-20240130155021664


3.queue的初步介绍

image-20240130162024817

  1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。

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

  3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:

  • empty:检测队列是否为空
  • size:返回队列中有效元素的个数
  • front:返回队头元素的引用
  • back:返回队尾元素的引用
  • push_back:在队列尾部入队列
  • pop_front:在队列头部出队列
  1. 标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。

image-20240130162405130


4.queue的使用

image-20240130162333933

函数说明
queue()构造空的队列
empty()检测队列是否为空,是返回true,否则返回false
size()返回队列中有效元素的个数
front()返回队头元素的引用
back()返回队尾元素的引用
push()在队尾将元素val入队列
pop()将队头元素出队列
#include<iostream>
#include<queue>
using namespace std;int main()
{queue<int> q;//一个空队列q.push(1);q.push(2);q.push(3);//push进去3个while (!q.empty())//当q不空进循环{cout << q.front() << endl;//输出队头元素q.pop();//出队}//遍历结束return 0;
}

在这里插入图片描述


5.容器适配器

5.1含义

容器适配器是一种将现有的容器类型适配为不同接口的容器的工具。C++标准库提供了三种主要的容器适配器:栈(stack)、队列(queue)和优先队列(priority_queue)。这些适配器都是基于现有的序列容器(如vector、deque或list)实现的,但提供了不同的接口和行为。

  1. 栈(stack):栈是一种后进先出(LIFO)的数据结构,它只允许在栈顶进行插入和删除操作。在C++中,栈适配器基于deque或vector实现,提供了push、pop、top等操作。
  2. 队列(queue):队列是一种先进先出(FIFO)的数据结构,它允许在队列的前端进行删除操作,在队列的后端进行插入操作。在C++中,队列适配器也基于deque或list实现,提供了push、pop、front、back等操作。
  3. 优先队列(priority_queue):优先队列是一种特殊的队列,它根据元素的优先级进行排序。在C++中,优先队列适配器基于vector实现,提供了push、pop、top等操作。

今天先来模拟栈和队列。优先队列,下次单独细讲

怎么理解“适配为不同接口的容器”:

容器适配器(上述三种)提供的操作接口与底层容器的操作接口不同。虽然容器适配器底层使用了常见的序列容器(如vector、deque或list)来存储数据,但是它们暴露的操作接口与这些底层容器不同。

举个例子,让我们比较一下栈(stack)适配器和vector容器的接口:

  1. 栈(stack)适配器的接口
  • push:将元素压入栈顶
  • pop:弹出栈顶元素
  • top:访问栈顶元素
  1. vector容器的接口
  • push_back:在vector的末尾插入元素
  • pop_back:删除vector的末尾元素
  • back:访问vector的末尾元素

如你所见,尽管栈适配器的底层容器可能是vector,但它提供了与vector不同的操作接口。栈适配器隐藏了vector的细节,只暴露了栈的相关操作,使得我们可以更方便地使用栈这种数据结构。

5.2STL标准库中stack和queue的底层结构

虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque,比如:

image-20240130164947721


6.模拟stack和queue

文件规划和一览

image-20240130172002973

stack.h:用来实现stack

queue.h:用来实现queue

test.cpp:进行测试

6.1模拟stack(stack.h)

#pragma oncenamespace MyStack
{template<class T, class Container = deque<T>>class stack{public://构造函数、析构函数之类的会去调用传过来的的类的void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}const T& top(){return _con.front();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;//封装这个类型};
}

在这里插入图片描述

6.2模拟queue(queue.h)

#pragma oncenamespace MyQueue
{template<class T, class Container = deque<T>>class queue{public://构造函数、析构函数之类的会去调用传过来的的类的void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}const T& front(){return _con.front();}const T& back(){return _con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;//封装这个类型};
}

image-20240130175332670


好啦大家,这次就到这里啦!!下次就带来优先级队列priority_queue的介绍和模拟。感谢大家

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

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

相关文章

Python六级考试笔记

Python六级考试笔记【源源老师】 六级标准 一、 掌握文件操作及数据格式化。 二、 掌握数据可视化操作。 三、 理解类与对象的概念&#xff0c;初步掌握类与对象的使用。 四、 掌握SQLite数据库基础编程。 五、 掌握简单的使用tkinter的GUI设计。 ​ 1. 文件操作 &#xff0…

每日OJ题_二叉树dfs①_力扣2331. 计算布尔二叉树的值

目录 力扣2331. 计算布尔二叉树的值 解析代码 力扣2331. 计算布尔二叉树的值 2331. 计算布尔二叉树的值 难度 简单 给你一棵 完整二叉树 的根&#xff0c;这棵树有以下特征&#xff1a; 叶子节点 要么值为 0 要么值为 1 &#xff0c;其中 0 表示 False &#xff0c;1 表示…

【C++】模版初阶

目录 泛函编程 函数模版 概念 格式 原理 实例化 模版函数的匹配原则 类模板 定义格式 泛函编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, dou…

数学建模:K-means聚类手肘法确定k值(含python实现)

原理 当K-means聚类的k值不被指定时&#xff0c;可以通过手肘法来估计聚类数量。   在聚类的过程中&#xff0c;随着聚类数的增大&#xff0c;样本划分会变得更加精细&#xff0c;每个类别的聚合程度更高&#xff0c;那么误差平方和&#xff08;SSE&#xff09;会逐渐变小&am…

上门回收小程序开发,互联网下发展机遇

在当下生活水平大幅度上升发展下&#xff0c;回收成为了人们日常生活中的一部分。 如今&#xff0c;随着互联网的快速发展&#xff0c;回收行业也进行了升级换代&#xff0c;由传统的线下回收门店到回收箱在到当下的线上互联网回收模式&#xff0c;迈向了“互联网废品回收”的…

如何清除谷歌浏览器的缓存?这里有详细步骤

如果你想解决加载或格式化问题&#xff0c;以改善你在谷歌Chrome上的浏览体验&#xff0c;那么清除缓存和cookie是一个很好的开始。以下是删除它们的方式和操作。 删除缓存和cookie时会发生什么 当你访问一个网站时&#xff0c;它有时会保存&#xff08;或记住&#xff09;某…

使用 Chainlit, Langchain 及 Elasticsearch 轻松实现对 PDF 文件的查询

在我之前的文章 “Elasticsearch&#xff1a;与多个 PDF 聊天 | LangChain Python 应用教程&#xff08;免费 LLMs 和嵌入&#xff09;” 里&#xff0c;我详述如何使用 Streamlit&#xff0c;Langchain, Elasticsearch 及 OpenAI 来针对 PDF 进行聊天。在今天的文章中&#xf…

002 GIS数据的基本格式

1 地理空间信息 地理空间信息的数据模型是现实世界的特征组到理想状态的简化或抽象&#xff0c; 并且可以在各种GIS软件的用户使用层&#xff08;结构化&#xff09;模型有很多。 该层模型由多个空间数据的分层构建&#xff0c;如 图 1.5 。 根据内容&#xff0c;离散特征信息…

React环境配置

1.安装Node.js Node.js官网&#xff1a;https://nodejs.org/en/ 下载之后按默认选项安装好 重启电脑即可自动完成配置 2.安装React 国内使用 npm 速度很慢&#xff0c;可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm。 ①使用 winR 输入 cmd 打开终端 ②依…

怎样让MCU/SFU视频会议ovmedia 接入GB28281监控视频参会互动

在国内视频应用对GB监控接入是常规操作&#xff0c;很多系统需要接入监控视频交互处理。我们以ovmedia视频会议为例做一个接入互动。 GB28181协议在流媒体系统较为普及&#xff0c;我们以开源SRS系统对接监控端再接入会议&#xff08;也可以用商用GB流平台&#xff0c;操作基本…

VNCTF 2024 Web方向 WP

Checkin 题目描述&#xff1a;Welcome to VNCTF 2024~ long time no see. 开题&#xff0c;是前端小游戏 源码里面发现一个16进制编码字符串 解码后是flag CutePath 题目描述&#xff1a;源自一次现实渗透 开题 当前页面没啥好看的&#xff0c;先爆破密码登录试试。爆破无果…

MATLAB知识点:uniquetol函数(★★☆☆☆)考虑了一定的容差的unique函数

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第三…

wayland(xdg_wm_base) + egl + opengles——dma_buf 作为纹理数据源(五)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、EGL dma_buf import 相关的数据结构和函数1. EGLImageKHR2. eglCreateImageKHR()3. glEGLImageTargetTexture2DOES()二、egl 中 import dma_buf 作为纹理的代码实例1. egl_wayland_dmabuf_…

洛谷: P1479 宿舍里的故事之五子棋

题目链接: https://www.luogu.com.cn/problem/P1479 思路: 这道题目可以打表或者搜索。每个位置有选择/不选择两种情况。搜索的时候我们一行一行的搜索&#xff0c;直到使用的棋子达到n为止。b[i]为五子连线的数量&#xff0c;b[i] 1表示五子连线的数量可以取i&#xff0c;在…

圆筒形正压式采样器

一个人不愿意努力的时候&#xff0c;你怎样帮他也没有用&#xff01;一个人不愿意被点燃的时候&#xff0c;你怎样燃烧也没有用&#xff01;自己想醒&#xff0c;没有闹铃也能够醒来&#xff01;自己想努力&#xff0c;没有帮助也能够成功&#xff01;自己想点燃梦想&#xff0…

项目管理工具软件Maven趣闻

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Maven这个单词来自于意第绪语&#xff08;Yiddish&#xff09;&#xff0c;这是一种与德语和希伯来语有密切关系的犹太民族语言。在这个语境中&#xff0c;Maven意为“知识的…

什么原因导致百度百科建立一直审核不通过?

百科词条对网络营销实在是太重要了&#xff0c;不管是个人还是企业想在网上开展业务&#xff0c;都必要建立百科词条。自己动手编辑百科词条&#xff0c;搞个几十次也审核不过的情况比比皆是。 为什么百度百科总是审核不通过&#xff1f;百度官方发表过声明表示百度百科词条是人…

C#学习(十三)——多线程与异步

一、什么是线程 程序执行的最小单元 一次页面的渲染、一次点击事件的触发、一次数据库的访问、一次登录操作都可以看作是一个一个的进程 在一个进程中同时启用多个线程并行操作&#xff0c;就叫做多线程 由CPU来自动处理 线程有运行、阻塞、就绪三态 代码示例&#xff1a; cl…

C++ STL: list使用及源码剖析

list使用 list常用函数及使用&#xff08;1&#xff09; #include <iostream> #include <list> #include <algorithm>int main() {// 创建liststd::list<int> myList {5, 2, 9, 1, 5, 6};// 打印liststd::cout << "Original list: &quo…

【论文精读】GPT2

摘要 在单一领域数据集上训练单一任务的模型是当前系统普遍缺乏泛化能力的主要原因&#xff0c;要想使用当前的架构构建出稳健的系统&#xff0c;可能需要多任务学习。但多任务需要多数据集&#xff0c;而继续扩大数据集和目标设计的规模是个难以处理的问题&#xff0c;所以只能…