C++修炼之路之STL_stack,queue和容器适配器

目录

前言 

一:SLT中stack和queue的基本使用

1.在官网中对stack和queue的简单介绍

2.数据结构中栈和队列的基本知识和操作 

3. STL中stack的接口函数及使用

4.STL中queue的接口函数及使用 

二:容器适配器Container 

三:使用容器适配器来模拟实现stack和queue

1.stack的模拟实现

2.queue的模拟实现

3.stack和queue默认容器适配器deque

1.deque(双端队列):是一种双开口的连续空间的数据结构,和vector和list一样都是容器,但和liat相比它支持头尾两端进行插入和删除操作,空间利用率高,支持下标的随机访问,和vector相比头插效率高,不需要挪动数据

2.结构与list,vector的关系​编辑

 3.接口函数及说明(只需了解)

4.了解底层结构 

5.deque的不足和缺陷 

6.deque被选择当默认容器的原因 

四:本篇内容相关代码连接



接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧

前言 

在经过数据结构的栈和队列的了解后,在c++的STL中也实现了栈和队列,相对于数据结构部分的栈和队列,在c++中栈和队列的底层实现结构中加入了容器适配器的知识,使其可以更好的复用list和vector中的操作来模拟实现栈和队列

一:SLT中stack和queue的基本使用

1.在官网中对stack和queue的简单介绍

对于容器适配器将在后面模拟实现时说明

2.数据结构中栈和队列的基本知识和操作 

如有不懂可以点击链接参考下面的文章

https://blog.csdn.net/Miwll/article/details/136610477?spm=1001.2014.3001.5501

3. STL中stack的接口函数及使用

演示代码: 

#include <iostream>
#include <stack>
#include <queue>
using namespace std;
int main()
{stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);st.push(6);cout << st.size() << endl;while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;return 0;
}

4.STL中queue的接口函数及使用 

代码演示:

queue<int> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
q.push(5);
q.push(6);//队尾入数据
while (!q.empty())
{cout << q.front() << " ";//对头出数据q.pop();
}
cout << endl;

二:容器适配器Container 

1.适配器就是一种设计模式,将一个类的接口转换为另一个接口

2.从上面对stack和queue的简单介绍中可以看出,他俩不属于容器,而是容器适配器,就是将其他容器如list和vector的函数接口进行封装直接提供给stack和queue使用,默认的容器适配器是deque(稍后简单介绍)

3.在前面的list的模拟实现的最后也提到了Container容器来打印不同数据类型的数据,如

三:使用容器适配器来模拟实现stack和queue

1.stack的模拟实现

#pragma once
namespace mjw
{template<class T,class Container=deque<T>>//容器适配器给的缺省值为dequeclass stack{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}const T& top(){return _con.back();}bool empty(){return _con.empty();}size_t  size(){return _con.size();}private:Container _con;};
}

使用容器Container 来的实现的过程就是使用模板,将使用vector或list在stack来调用他们的接口函数来模拟实现stack,再次体现了c++的封装特性

2.queue的模拟实现

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

这里不能使用vector,原因是vector不支持pop_front()接口函数

3.stack和queue默认容器适配器deque

1.deque(双端队列):是一种双开口的连续空间的数据结构,和vector和list一样都是容器,但和liat相比它支持头尾两端进行插入和删除操作,空间利用率高,支持下标的随机访问,和vector相比头插效率高,不需要挪动数据
2.结构与list,vector的关系

 3.接口函数及说明(只需了解)

4.了解底层结构 

deque实际不是真正的连续空间,而是由每一段连续的小空间连接而成的,实际结构是一个中控数组,就是个指针数组

对于deque 的插入操作其实当中控数组都满了后,进行扩容再插入,一般对于中间位置的插入是整体挪动数据,不改变中控数组的大小,这样便于[]的访问

5.deque的不足和缺陷 

deque和vector相比,头部插入和删除时,不需要挪动数据,而且效率高,在扩容时不需要大量挪动数据,但效率还是vector好

与list相比,空间连续,空间的利用率高,支持下标的随机访问

但deque不适合遍历,在遍历时,deque的迭代器要频繁的去检测是否挪动到边界,导致效率低下,所以大多数情况下还是使用list和vector

6.deque被选择当默认容器的原因 

1.stack和queue不需要遍历,不用迭代器

2.在stack和queue中元素增长时,deque比vector的效率高

四:本篇内容相关代码连接

https://gitee.com/lin-ciyu/cplusplus/tree/master/STL_stack_queue/STL_stack_queue

感谢观看,期待与你的再次相会

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

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

相关文章

springboot Logback 不同环境,配置不同的日志输出路径

1.背景&#xff1a; mac 笔记本开发&#xff0c;日志文件写到/data/logs/下&#xff0c;控制台报出&#xff1a;Failed to create parent directories for [/data/logs/........... 再去手动在命令窗口创建文件夹data&#xff0c;报Read-only file system 2.修改logback-spri…

Linux安装和使用Android Debug Bridge(ADB)

目录 1、开发环境和工具 2、ADB是什么&#xff1f; 3、安装ADB 3.1、使用包管理器安装 ADB 3.2、手动安装 ADB 4、使用ADB 4.1、连接设备 4.2、执行shell命令 4.3、安装应用程序 4.4、截取屏幕截图 4.5、模拟按键和手势 4.6、上传文件到Android设备 4.7、从Android设备下载文件…

BGP边界网关路由实验(华为)

一&#xff0c;技术简介 BGP&#xff08;边界网关路由协议&#xff09;是一种自治系统&#xff08;AS&#xff09;间的协议&#xff0c;主要用于在不同的AS之间交换路由信息。AS是一个由一组网络设备和路由器组成的网络集合&#xff0c;这些设备可以在一个共同的管理域中协同工…

1 回归:锂电池温度预测top2 代码部分(一) Tabnet

2024 iFLYTEK A.I.开发者大赛-讯飞开放平台 TabNet&#xff1a; 模型也是我在这个比赛一个意外收获&#xff0c;这个模型在比赛之中可用。但是需要GPU资源&#xff0c;否则运行真的是太慢了。后面针对这个模型我会写出如何使用的方法策略。 比赛结束后有与其他两位选手聊天&am…

win2022服务器apache配置https(ssl)真实环境实验(避坑之作)不依赖宝塔小皮等集成环境

本次实验背景&#xff1a; 完全参考官方 https://cloud.tencent.com/document/product/400/4143 文档流程&#xff0c;没有搞定&#xff0c;于是写下避坑之作。 服务器&#xff1a;腾讯云轻量应用服务器 操作系统&#xff1a; Windows Server 2022 DataCenter 64bit CN apache…

李沐45_SSD实现——自学笔记

主体思路&#xff1a; 1.生成一堆锚框 2.根据真实标签为每个锚框打标(类别、偏移、mask) 3.模型为每个锚框做一个预测(类别、偏移) 4.计算上述二者的差异损失&#xff0c;以更新模型weights 先读取一张图像。 它的高度和宽度分别为561和728像素。 %matplotlib inline import …

Photoshop 2024 (ps) v25.6中文 强大的图像处理软件 mac/win

Photoshop 2024 for Mac是一款强大的图像处理软件&#xff0c;专为Mac用户设计。它继承了Adobe Photoshop一贯的优秀功能&#xff0c;并进一步提升了性能和稳定性。 Mac版Photoshop 2024 (ps)v25.6中文激活版下载 win版Photoshop 2024 (ps)v25.6直装版下载 无论是专业的设计师还…

EI Scopus双检索 | 2024年清洁能源与智能电网国际会议(CCESG 2024)

会议简介 Brief Introduction 2024年清洁能源与智能电网国际会议(CCESG 2024) 会议时间&#xff1a;2024年 11月27-29日 召开地点&#xff1a;澳大利亚悉尼 大会官网&#xff1a;CCESG 2024-2024 International Joint Conference on Clean Energy and Smart Grid 由CoreShare科…

m4p转换mp3格式怎么转?3个Mac端应用~

M4P文件格式的诞生伴随着苹果公司引入FairPlay版权管理系统&#xff0c;该系统旨在保护音频的内容。M4P因此而生&#xff0c;成为受到FairPlay系统保护的音频格式&#xff0c;常见于苹果设备的iTunes等平台。 MP3文件格式的多个优点 MP3格式的优点显而易见。首先&#xff0c;其…

k8s之etcd

1.特点&#xff1a; etcd 是云原生架构中重要的基础组件。有如下特点&#xff1a; 简单&#xff1a;安装配置简单&#xff0c;而且提供了 HTTP API 进行交互&#xff0c;使用也很简单键值对存储&#xff1a;将数据存储在分层组织的目录中&#xff0c;如同在标准文件系统中监…

vscode msvc qt环境搭建

自己整了好久都没把环境搞好&#xff0c;后来发现已经有大佬搞好了插件&#xff0c;完全不需要自己整理。 下载如下插件&#xff1a; 第二个qt插件就可以自动帮我们生成工程了。 可惜目前似乎支持win&#xff0c;另外就是debug模式运行后会报qwindowsd.dll插件找不到的错误&a…

【简单讲解下如何用爬虫玩转石墨文档】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

链表OJ - 6(链表分割)

题目描述&#xff08;来源&#xff09; 现有一链表的头指针 ListNode* pHead&#xff0c;给一定值x&#xff0c;编写一段代码将所有小于x的结点排在其余结点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排列后的链表的头指针。 思路 创建两个链表&#xff0c…

ChatGPT:引领未来的语言模型革命?

一、引言 随着人工智能技术的不断发展&#xff0c;Chat GPT作为一种自然语言处理技术&#xff0c;已经逐渐渗透到各个领域&#xff0c;具有广泛的应用前景。本文将从多个角度探讨Chat GPT的应用领域及其未来发展趋势。 ChatGPT的语言处理能力超越了以往任何一款人工智能产品。…

Docker一键快速私有化部署(Ollama+Openwebui) +AI大模型(gemma,llama2,qwen)20240417更新

几行命令教你私有化部署自己的AI大模型&#xff0c;每个人都可以有自己的GTP 第一步&#xff1a;安装Docker(如果已经有了可以直接跳第二步) ####下载安装Docker wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo##…

STM32 USB虚拟串口

电路原理图 usb部分 晶振部分 usb与单片机连接 配置信息 sys配置信息 rcc配置信息 usb配置信息 虚拟串口配置信息 时钟配置信息 项目配置信息 代码 包含文件 主函数代码 实验效果 修改接收波特率依然可以正常接收&#xff0c;也就是说单片机可以自动适应上位机的波特率设置。…

4.17作业

#include "double_link_list.h" node_p create_double_link_list() //创建双向链表 {node_p H(node_p)malloc(sizeof(node));if(HNULL){printf("空间申请失败\n");return NULL;}H->data0;H->priNULL;H->nextNULL;return H; } node_p create_node…

BUUCTF——[GXYCTF2019]BabyUpload

BUUCTF——[GXYCTF2019]BabyUpload 1.上传嘛&#xff0c;直接丢正常的jpg文件进服务器 2.发现可以正常上传&#xff0c;并且回显出来啦文件上传的路径 /var/www/html/upload/7df22610744ec51e9cb7a8a8eb674374/1111.jpg 3.尝试上传一句话木马 <?php eval($POST[123456]…

HDFS详解(Hadoop)

Hadoop 分布式文件系统&#xff08;Hadoop Distributed File System&#xff0c;HDFS&#xff09;是 Apache Hadoop 生态系统的核心组件之一&#xff0c;它是设计用于存储大规模数据集并运行在廉价硬件上的分布式文件系统。 1. 分布式存储&#xff1a; HDFS 将文件分割成若干块…

「 网络安全常用术语解读 」漏洞利用交换VEX详解

漏洞利用交换&#xff08;Vulnerability Exploitability eXchange&#xff0c;简称VEX&#xff09;是一个信息安全领域的标准&#xff0c;旨在提供关于软件漏洞及其潜在利用的实时信息。根据美国政府发布的用例(PDF)&#xff0c;由美国政府开发的漏洞利用交换(VEX)使供应商和用…