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

news2024/11/29 8:46:48

目录

前言 

一: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>>//容器适配器给的缺省值为deque
	class 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.coloradmin.cn/o/1603250.html

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

相关文章

浏览器工作原理与实践--安全沙箱:页面和系统之间的隔离墙

前面三篇文章我们主要围绕同源策略介绍了Web页面安全的相关内容&#xff0c;那今天我们把视野向外延伸&#xff0c;来聊聊页面安全和操作系统安全之间的关系。 在《仅仅打开了1个页面&#xff0c;为什么有4个进程&#xff1f;》那篇文章中&#xff0c;我们分析了浏览器架构的发…

第一篇【传奇开心果系列】我和AI面对面聊编程:深度比较PyQt5和tkinter.ttk

传奇开心果系列博文 系列博文目录我和AI面对面聊编程系列 博文目录前言一、今天我们面对广大读者选择PyQt5和tkinter.ttk做比较这个话题目的是什么&#xff1f;二、举一个最简单的pyqt5信号和插槽的例子三、这和tkinter的点击事件有什么区别&#xff1f;四、如何选择&#xff1…

深澜计费管理系统 /demo/proxy存在任意文件读取漏洞

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 深澜计费管理系统是一款用于网络设备计费管理的软件…

React + 项目(从基础到实战) -- 第八期

ajax 请求的搭建 引入mockAP接口设计AJAX 通讯 前置知识 HTTP 协议 , 前后端通讯的桥梁API : XMLHttpRequest 和 fetch常用工具axios mock 引入 Mock.js (mockjs.com) 使用 mockJS 前端代码中引入 mockJs定义要模拟的路由 , 返回结果mockJs 劫持ajax请求(返回模拟的结果)…

SPI 和W25Q128(使用SPI通讯读写W25Q128模块)

SPI 是什么&#xff1f; SPI 是串行外设接口&#xff08; Serial Peripheral Interface &#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上 只占用四根线 &#xff0c;节约了芯片的管脚&#xff0c;同时…

SecureCRT (Mac/Windows)中文---远程连接与管理的安全新选择

SecureCRT是一款功能强大的终端仿真程序&#xff0c;专为连接和管理远程系统而设计。它支持SSH&#xff08;包括SSH1和SSH2&#xff09;协议&#xff0c;确保用户与目标设备之间的通信安全&#xff0c;有效防止网络攻击和窥探。此外&#xff0c;SecureCRT还支持Telnet、Rlogin等…

Jmeter 接口造10w条用户数据

1、将mysql-connector-java-5.1.22-bin.jar放到D:\apache-jmeter-5.5\lib\ext目录下 2、在测试计划中&#xff0c;添加mysql-connector-java-5.1.22-bin.jar包路径 3、添加-线程组-添加-配置元件-jdbc connection configuration 4、配置jdbc连接参数 设置变量名称&#xff1a;…

ASP.NET基于SVG的自动站雨量分析系统

摘 要 SVG是由W3C组织开发的基于可扩展标记语言的一种矢量图形描述语言&#xff0c;已经在互联网上得到了较广泛的应用。为了以图形方式直观地显示雨量数据变化&#xff0c;方便工作人员进行雨量数据的查询及分析&#xff0c;设计了本套基于SVG的雨量分析系统。 该自动站雨量…

基于SSM+Jsp+Mysql的准速达物流管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

wsl安装与日常使用

文章目录 一、前向配置1、搜索功能2、勾选下面几个功能&#xff0c;进行安装二、安装WSL1、打开Windows PowerShell,查找你要安装的linux版本2、选择对应版本进行安装3、输入用户名以及密码 三、配置终端代理1、打开powershell,查看自己的IP把以下信息加入到~/.bashrc中 四、更…

【论文速读】| 大语言模型是边缘情况模糊测试器:通过FuzzGPT测试深度学习库

本次分享论文为&#xff1a;Large Language Models are Edge-Case Fuzzers: Testing Deep Learning Libraries via FuzzGPT 基本信息 原文作者&#xff1a;Yinlin Deng, Chunqiu Steven Xia, Chenyuan Yang, Shizhuo Dylan Zhang, Shujing Yang, Lingming Zhang 作者单位&…

MySQL Explan执行计划详解

Explan执行计划 首先我们采用explan执行计划 执行一条sql&#xff0c;发现返回了12个列&#xff0c;下面会详细解释每一列 1、ID列 id列的值是代表了select语句执行顺序&#xff0c;是和select相关联的&#xff1b;id列的值大的会优先执行&#xff0c;如果id列为空最后执行&a…

python后端相关知识点汇总(十二)

python知识点汇总十二 1、什么是 C/S 和 B/S 架构2、count(1)、count(*)、count(列名)有啥区别&#xff1f;3、如何使用线程池3.1、为什么使用线程池&#xff1f; 4、MySQL 数据库备份命令5、supervisor和Gunicorn6、python项目部署6.1、entrypoint.sh制作6.2、Dockerfile制作6…

可见光相机曝光方式

可见光摄影中的曝光方式主要包括两种&#xff1a;卷帘曝光和全局曝光。它们之间的区别在于曝光过程中传感器或胶片感光部分的工作方式不同&#xff0c;这直接影响到图像捕获的效果和特性。 卷帘曝光&#xff08;Rolling Shutter&#xff09;&#xff1a; 工作原理&#xff1a;在…

Day 16 Linux服务管理和日志管理

服务管理 启动服务&#xff1a;systemctl start 服务名 停止服务&#xff1a;systemctl stop 服务名 重启服务&#xff1a;systemctl restart 服务名 重新加载配置文件&#xff1a;systemctl reload 服务名&#xff08;期间并不停止服务进程&#xff09; 查看服务运行状态…

GAN反演+老照片修复

关于老照片修复~~~~~上图为运行腾讯ARC的模型之后的效果图 其使用的模型&#xff0c;GFP-GAN&#xff0c;Towards Real-World Blind Face Restoration with Generative Facial Prior&#xff0c;理解记录如下&#xff1a; Abstract: In this work, we propose GFP-GAN that …

专业143总分428学硕第一东南大学920专业基础综合考研经验电子信息与通信工程,海洋工程,电路系统,鲁汶,真题,大纲,参考书。

24考研基本已经尘埃落定&#xff0c;总归要为回忆留下点什么。回想起这一年的备考之路&#xff0c;至今仍觉得时间过得很快&#xff0c;有些感到恍惚&#xff0c;似乎不能接受。但是仔细思考一下&#xff0c;这一年经历了很多&#xff0c;走过很多弯路也取得一些阶段性的小成功…

React【Day2】

React表单控制 受控绑定 概念&#xff1a;使用React组件的状态&#xff08;useState&#xff09;控制表单的状态 双向绑定 MVVM 报错记录&#xff1a; 错误代码&#xff1a; import { useState } from "react";const App () > {const [value, setValue] useS…

使用Android studio,安卓手机编译安装yolov8部署ncnn,频繁出现编译错误

从编译开始就开始出现错误&#xff0c;解决步骤&#xff1a; 1.降低graddle版本&#xff0c;7.2-bin --->>> 降低为 6.1.1-all #distributionUrlhttps\://services.gradle.org/distributions/gradle-7.2-bin.zip distributionUrlhttps\://services.gradle.org/di…

2024年五一杯数学建模B题思路分析

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…