【C++】stackqueuedeque

news2024/9/20 22:01:48

目录

一、stack:

1、栈的介绍:

2、栈的使用:

3、栈的成员函数的模拟实现:

二、queue:

1、队列的介绍:

2、队列的使用:

3、队列的模拟实现:

三、deque:

deque的底层结构:

deque和vector和list的区别:

deque致命缺陷:


在stl中,有许多容器比如:string,vector,list,deque,map,set等等,

但是STL提供的两个容器queue和stack,其实都只是容器适配器而已,下面是关于queue,stack和deque的笔记:

一、stack:

1、栈的介绍:

stack(栈)是一种容器适配器,其特点是只能够在容器的一端进行元素的插入和提取操作。

2、栈的使用:

常用的栈的成员函数有

检查栈顶是否为空(empty())

返回栈中的元素个数(size())

返回栈顶元素的引用(top())

将元素val入栈(push())

将栈顶元素出栈(pop())

接下来,将上述的成员函数进行模拟实现:

3、栈的成员函数的模拟实现:

思路:

可采用两个模版参数,一个来控制数据类型,一个来控制底层结构,可以传vector或者list,在后面一个模版参数中可以加上一个缺省参数deque作为默认容器。

那么在stack的成员函数模拟实现中就可以直接调用容器的成员函数来实现。

namespace ppr
{
	template<class T, class Container = deque<T>>
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_back();
		}

		T& top()
		{
			return _con.back();
		}

		size_t size()
		{
			return _con.size();
		}

		bool empty()
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
	void stack_test1()
	{
		stack<int> st1;
		st1.push(1);
		st1.push(2);
		st1.push(3);
		st1.push(4);
		cout << "此时栈顶元素是:" << st1.top() << endl;

		cout << "该栈的结构为:" << endl;
		while (!st1.empty())
		{
			cout << st1.top() << " ";
			st1.pop();
		}
		cout << endl;
	}
}

二、queue:

1、队列的介绍:

队列也是一种容器适配器,它是在容器的一端插入元素,在另外一端进行提取元素。

2、队列的使用:

常用的栈的成员函数有

检查队列是否为空(empty())

返回队列中的元素个数(size())

返回队列的队头元素的引用(front())

返回队列的队尾元素的引用(back())

将元素val入队列(push())

将栈顶元素出队列(pop())

接下来,将上述的成员函数进行模拟实现:

3、队列的模拟实现:

namespace ppr
{
	template<class T, class Container = deque<T>>
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_front();
		}
		T& front()
		{
			return _con.front();
		}

		T& back()
		{
			return _con.back();
		}

		size_t size()
		{
			return _con.size();
		}

		bool empty()
		{
			return _con.empty();
		}
	private:
		Container _con;
	};

	void queue_test1()
	{
		queue<int,list<int>> st1;
		st1.push(10);
		st1.push(20);
		st1.push(30);
		st1.push(40);
		cout << "front是" << st1.front() << endl;
		cout << "back是" << st1.back() << endl;

		cout << "该队列的结构为:" << endl;
		while (!st1.empty())
		{
			cout << st1.front() << " ";
			st1.pop();
		}
		cout << endl;
	}
}

三、deque:

vector能够支持下标随机访问,但是存在扩容问题,只能中部和头部插入效率问题(毕竟要移动数据)

list能够在任意位置插入和删除都可以,但不支持下标随机访问,

那么后来有大佬搞了deque,

deque:

是一种双端队列(double ended queue):可以在头尾两端进行插入和删除,比vector的头插效率高,毕竟不需要移动元素,比list空间利用率高。

deque的底层结构:

deque是由一个中控数组(指针数组),每个指针指向一块相等大小的空间。数据就插入在这些被指向的空间中,如果空间不够需要扩容,就从中控数组中扩容,然后新的数组的值再指向一块新的空间。如果中控数组也满了就扩容中控数组。

接下来看看deque的成员函数:

通过下图可以看到,deque基本涵盖了vector和list的所有部分,使用起来几乎没有差异。

deque和vector和list的区别:

deque和vector:

极大地缓解了扩容/头插/头删问题,扩容时也不需要移动元素,效率就高

deque和list:

可以支持下标随机访问,空间利用率高

根据以上的特点,deque就特别适合做栈和队列的默认容器。

deque致命缺陷:

不适合遍历,在遍历的时候会频繁地去检查所要找的元素在哪一个空间中导致效率低,

因此大多数时候都考虑使用vector和list。

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

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

相关文章

电脑丢失msvcp120.dll问题原因及详细介绍msvcp120.dll丢失的解决方法

在使用 Windows 操作系统时&#xff0c;你可能会遇到一个常见的错误提示&#xff1a;“程序无法启动&#xff0c;因为计算机中丢失 msvcp120.dll”。这个错误通常意味着你的系统中缺少了一个重要的动态链接库文件&#xff0c;即msvcp120.dll。这个文件是 Microsoft Visual C 20…

一文读懂SpringMVC的工作原理

前言 MVC是经典的软件架构设计模式&#xff0c;几乎在各个领域各种开发语言中&#xff0c;均采纳了这个思想。此刻博主突然想到了Thinking in xxx系列设计书籍。换句话说&#xff0c;就是“各人自扫门前雪”和“术业有专攻”。当职责分配得当后&#xff0c;剩下的就是发挥各“…

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件&#xff0c;然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它&#xff0c;快速获取到想要知道的信息。https://www.chatpdf.com/

全志A527 A133 A523 T527 T133 H6 H8应用无法开启后台服务

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改4.1 代码修改方法14.2 代码修改方法24.3 代码修改方法35.彩蛋1.前言 像全志的很多平台,普通的app并不能正常的启动后台的服务,这样对于应用层很困扰,无法启动后台的服务,功能就不能正常使用…

2024最新软件测试面试题(带答案)

1. 请自我介绍一下(需简单清楚的表述自已的基本情况&#xff0c;在这过程中要展现出自信&#xff0c;对工作有激情&#xff0c;上进&#xff0c;好学) 面试官您好&#xff0c;我叫###&#xff0c;今年26岁&#xff0c;来自江西九江&#xff0c;就读专业是电子商务&#xff0c;毕…

新160个crackme - 052-tc.2

运行分析 提示选择Keyfile&#xff0c;选择后弹出错误的Keyfile&#xff0c;需要先破解Keyfile还需要破解Name和Serial PE分析 Delphi程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida找到Keyfile关键字符串&#xff0c;双击进入 ida动态调试&#xff0c;找到关…

moment() 时间

指定日期月初/月末 moment(自定义时间) 当月月初&#xff08;假设当月8月&#xff09;2024-08-01 00:00:00 moment().startOf(“month”).format(“YYYY-MM-DD HH:mm:ss”) 当月月末 2024-08-31 23:59:59 moment().endOf(“month”).format(“YYYY-MM-DD HH:mm:ss”) 加法 ad…

【小项目】python贪吃蛇小游戏设计

引入pygame库 添加pygame库&#xff0c;在cmd中输入以下代码&#xff0c;进行安装。如果输入pip install pygame出现以下报错&#xff0c;可以尝试在前面加入python3 -m。 python3 -m pip install pygame 贪吃蛇代码 import pygame import time import random# 初始化 Pygam…

使用yolov8识别+深度相机+机械臂实现垃圾分拣机械臂(代码分享)

文章目录 垃圾分拣机械臂视频演示程序主代码完整代码链接 垃圾分拣机械臂 视频演示 点击查看 使用YoloV8做的目标检测&#xff0c;机械臂手眼标定使用Aruco的方式&#xff0c;通过深度相机获取三维坐标&#xff0c;与机械臂坐标系之间的转化&#xff0c;得到抓取的坐标深度相…

猜数游戏-Rust 入门经典案例

文章目录 发现宝藏1. 项目概述2. 项目结构3. 实现游戏4. 依赖管理5. 测试6. 改进和扩展7. 总结 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 在这篇博客中&#xff0c;我们将…

网站钓鱼——挂马技术手段介绍

更多网安实战内容&#xff0c;可前往无问社区查看http://wwlib.cn/index.php/artread/artid/10194.html 网站挂马目前已经成为流氓软件以及红队人员快速获取目标主机权限的常用手段之一&#xff0c;在长时间的实战中也是出现了层出不穷的钓鱼方法&#xff0c;这次分享一下实际…

酒茶香链接心灵——探寻现代人幸福生活

科技在飞速发展&#xff0c;人类社会以前所未有的速度向前跃进&#xff0c;物质世界的繁荣达到了前所未有的高度。 然而&#xff0c;这光鲜的背后&#xff0c;却无形中拉远了人与人之间的距离&#xff0c;割裂了传统文化的根脉。 传统文化势弱、“快餐文化”层出不穷&#xff0…

synchronized锁升级及CAS和AQS简述

概述 为什么会有锁升级的步骤呢&#xff0c;假设没有这个步骤&#xff0c;多个线程竞争时&#xff0c;抢到锁的线程直接运行&#xff0c;其他的都直接sleep/wait&#xff0c;然后等第一个线程运行完成后&#xff0c;再由操作系统唤醒接下来的线程。这个一套动作下来就很费调度…

【学习笔记】SSL密码套件之密钥交换

本篇将介绍密钥交换常用的协议&#xff0c;分别是ECDHE&#xff0c;DHE&#xff0c;ECDH&#xff0c;DH&#xff0c;RSA&#xff0c;PSK 密钥交换的目的&#xff1a;建立种子值&#xff08;Seed Value&#xff09; 种子值&#xff08;二进制数字&#xff09;用于生成额外的对称…

Python Opencv: 基于颜色提取的印章分割

利用Python实现了一个图像处理功能&#xff0c;即批量提取图像中的印章区域&#xff1b;使用了颜色聚类的方法来提取颜色。 本代码也发布到了github&#xff0c;欢迎大家试用&#xff08;如果帮助&#xff0c;请star一下&#xff09;&#xff1a; GitHub - AICVHub/seal_seg_o…

讯鹏PDA扫码机一维/二维条码扫描轻松应对各种应用场景

在数字化系统集成中&#xff0c;选择合适的PDA手持机至关重要。然而&#xff0c;市场上许多PDA手持机存在扫码不灵敏精度差、屏幕小、系统卡、可靠性弱、易损坏等问题&#xff0c;给用户带来诸多困扰。针对这些痛点&#xff0c;讯鹏推出了一款5.72寸全面屏手持扫码PDA&#xff…

Unity6 + UE5.4 PSO缓存实践记录

题图&#xff08;取自COD冷战的着色器编译提示&#xff09; PSO&#xff08;管线状态对象 Pipeline State Object&#xff09;是伴随现代图形API&#xff08;DirectX12、Vulkan、Metal&#xff09;而出现的概念&#xff0c;它本质上是单次绘制时渲染管线所处的状态信息的集合&…

滁州皖东农商银行新任董事长未得官宣,年报涉嫌泄露股东隐私

撰稿|芋圆 近期&#xff0c;滁州皖东农商银行发布2024年半年报&#xff0c;其2024年上半年营业收入4.7亿元&#xff0c;同比增长72%&#xff0c;成功实现扭亏为盈&#xff1b;净利润1.37亿元&#xff0c;同比上涨10%&#xff0c;增速显著提升。但其利息净收入1.4亿元&#xff…

梨花声音研修院退费普通话学习初级方法

普通话作为中国的官方语言和国家通用语言&#xff0c;学习和掌握普通话不仅对中国人至关重要&#xff0c;对世界各地的学习者也具有重要意义。无论是为了工作、学术、旅游还是文化交流&#xff0c;掌握普通话都能带来巨大的好处。以下是一些行之有效的普通话学习方法&#xff0…

PMP–一、二、三模–分类–14.敏捷–技巧–敏捷项目章程

文章目录 技巧一模14.敏捷--项目章程--产品意愿--是指产品负责人对产品未来前景和方向的一个高度概括描述&#xff0c;它应符合公司或组织的战略目标。产品愿景声明发送给项目团队中的每个人&#xff0c;保证团队都理解并认可产品愿景。64、 [单选] 在一次会议上&#xff0c;产…