【C++STL详解(七)】--------stack和queue介绍与使用

目录

前言

一、stack

Ⅰ.介绍

Ⅱ.使用

1、定义方式

2、常用接口:

3、使用示例

二、queue

Ⅰ、介绍

Ⅱ、使用

1、定义方式

2、常用接口

3、使用示例

三、deque(了解)

四、容器适配器


前言

前面我们已经在数据结构中已经了解到有关栈和队列的相关知识,想必都不陌生,核心操作就只有几个,C++库里也不例外!内容不多,一起来看stack和queue(建议PC端打开)

一、stack

Ⅰ.介绍

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

stack容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层元素,特定容器的尾部(即栈顶)被压入和弹出。
stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:
  • empty:判空操作
  • back:获取尾部元素操作
  • push_back:尾部插入元素操作
  • pop_back:尾部删除元素操作

比如前面我们提到的vector、list等容器都支持以上操作,就可以作为stack的底层容器!

 

Ⅱ.使用

1、定义方式

//方式一,不写就用默认的底层容器
stack<int> ss1;//方式二,利用特定的容器
stack<int,vector<int>> s2;
stack<int,list<int>> s3;

注意:不写默认的底层容器是deque!

2、常用接口:

empty()判断栈是否为空
size()返回栈的元素个数
top()返回栈顶元素的引用
push()将元素压入栈
pop()

栈顶元素出栈

3、使用示例

#include <iostream>
#include <stack>
#include <vector>
using namespace std;int main()
{stack<int> s;//默认底层容器是dequestack<int, vector<int>> s1;//压栈for (int i = 1; i <= 10; i++){s.push(i);}cout << s.size() << endl;//出栈while (!s.empty()){cout << s.top()<<" ";s.pop();}cout << endl;for (int i = 0; i <= 10; i++){s1.push(i);}cout << s1.size() << endl;while (!s1.empty()){cout << s1.top() << " ";s1.pop();}return 0;
}

二、queue

Ⅰ、介绍

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

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

底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:
  • empty:检测队列是否为空
  • size:返回队列中有效元素的个数
  • front:返回队头元素的引用
  • back:返回队尾元素的引用
  • push_back:在队列尾部入队列
  • pop_front:在队列头部出队列
很显然vector就不能作为其底层容器,因为没有pop_front()!deque和list依然可以作为底层容器!

Ⅱ、使用

1、定义方式

 

//方式一,默认底层容器是deque
queue<int> q1;//方式二,利用特定的容器
queue<int,list<int>> s2;

2、常用接口

empty()判断队列是否为空,bool类型
size()返回有效数据个数
front()返回队头元素的引用
back()返回队尾元素的引用
push()入队列
pop()出队列

3、使用示例

#include <iostream>
#include <queue>
#include <list>
using namespace std;int main()
{queue<int> q;//默认dequequeue<int, list<int>> q1;//入队for (int i = 1; i <= 10; i++){q.push(i);}cout << q.size() << endl;//出队while (!q.empty()){cout << q.front() << " ";q.pop();}cout << endl;for (int i = 0; i <= 10; i++){q1.push(i);}cout << q1.size() << endl;while (!q1.empty()){cout <<q1.front() << " ";q1.pop();}return 0;
}

三、deque(了解)

这里说一下简单了解一下deque,它实际上是被称为双端队列,是一种双开口的"连续"空间的数据结构!说白了就是可以在两端进行元素的插入和删除,可以这么认为它实际就是vector和list的结合体!

deque缺陷

  • 相比于vector,头插头删不需要移动大量数据,扩容也不需要搬移大量元素!效率更高
  • 相比于list,其底层是连续空间(并不是真正连续),空间利用率比较高,不需要存储额外字段。
  • 致命缺陷:不合适遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下!因此实际应用到它的机会不多,目前可见的是作为stack和queue的默认底层容器

为什么是它作为默认底层容器?

1. stackqueue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。
2. stack中元素增长时,dequevector的效率高(扩容时不需要搬移大量数据)queue中的元素增长 时,deque 不仅效率高,而且内存使用率高
结合了deque的优点,避开了其缺陷,所以作为默认底层容器!

四、容器适配器

适配器是一种设计模式 ( 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总 结) 该种模式是将一个类的接口转换成客户希望的另外一个接口
本质就是一种转化!在通俗一点来说就好像插排的转接器,让不合适的插座转化成你想要的插座!

今天的分享就到这里,大家不难发现,这里的stack和queue实际都是对底层容器的接口进行封装而已!同时特别注意一点stack和queue没有迭代器!

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

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

相关文章

【SSM进阶学习系列丨分页篇】PageHelper 分页插件集成实践

文章目录 一、说明什么是分页PageHelper介绍 二、导入依赖三、集成Spring框架中四、编写Service五、编写Controller六、编写queryAllByPage页面展示数据 一、说明 什么是分页 ​ 针对分页&#xff0c;使用的是PageHelper分页插件&#xff0c;版本使用的是5.1.8 。 ​ 参考文档…

07_Flutter使用NestedScrollView+TabBarView滚动位置共享问题修复

07_Flutter使用NestedScrollViewTabBarView滚动位置共享问题修复 一.案发现场 可以看到&#xff0c;上图中三个列表的滑动位置共享了&#xff0c;滑动其中一个列表&#xff0c;会影响到另外两个&#xff0c;这显然不符合要求&#xff0c;先来看下布局&#xff0c;再说明产生这个…

【FL常用插件#1】Ozone11臭氧的安装和使用

本文内容收集自互联网&#xff0c;仅供个人学习参考使用&#xff0c;不允许用于商业用途&#xff0c;造成的侵权行为与本文作者无关 安装 VST2、VST3、AAX和NKS是音频技术界常见的几种插件格式&#xff0c;它们在功能和兼容性上有所不同&#xff1a; VST2 (Virtual Studio Tec…

矩阵的压缩存储介绍

引入 概述 特殊矩阵的压缩 对称矩阵 三角矩阵 对角矩阵 稀疏矩阵 三元组存储 十字链表法 示例

Linux 第二十二章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

MapReduce的Shuffle过程

Shuffle是指从 Map 产生输出开始,包括系统执行排序以及传送Map输出到Reduce作为输入的过程. Shuffle 阶段可以分为 Map 端的 Shuffle 阶段和 Reduce 端的 Shuffle 阶段. Shuffle 阶段的工作过程,如图所示: Map 端的 Shuffle 阶段 1&#xff09;每个输入分片会让一个 Map 任务…

我的256天之创作纪念日

目录 时光 数据的一些变化 开心的事 憧憬 时光 自上次CSDN的消息推送&#xff0c;又一个128天过去了&#xff0c;整天的工作和生活都在忙忙碌碌中度过&#xff0c;每到能静下来片刻&#xff0c;都倍感珍惜。因为一些原因&#xff0c;能够陪伴家人的时间越来越少&#xff…

C语言 动态内存管理

目录 1. C/C程序的内存分配2. 动态内存分配的作用3. malloc - 分配内存4. free - 释放内存5. calloc - 分配并清零内存6. realloc - 调整之前分配的内存块7. 常见的动态内存的错误7.1 对空指针解引用7.2 对动态开辟空间的越界访问7.3 对非动态开辟内存使用free7.4 使用free释放…

软件设计师-应用技术-UML建模题3

基础知识及技巧&#xff1a; 1. 用例图&#xff1a; 1.1 考点&#xff1a; 题干里面有关项目的详细描述&#xff0c;完整用例图中的某些参与者和某些用来扣掉&#xff0c;根据题干内容和已有用例图补充。根据题干&#xff0c;分析用例图之间的关系。 1.2 基础知识&#xff…

力扣:62. 不同路径

62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…

仓库管理员如何入门?仓库管理六大步骤教会你!

新手菜鸟入行&#xff0c;如何做好一个仓库管理员&#xff1f;仓库运营对于许多行业至关重要&#xff0c;例如制造、零售和物流。它们涉及高效、安全地接收、仓储、拣选、包装和运输货物。 跟着这6个步骤做&#xff0c;最慢一个月&#xff0c;最快一周&#xff0c;就能轻松做好…

【Unity】使用Resources.LoadAll读取文件的顺序问题

最近在做客户的一个项目&#xff0c;其中的一个模块使用到了照片&#xff0c;但是发现了一个很严重的问题。当你在使用Unity的时候&#xff0c;它竟然不按照顺序读取&#xff1f;这个机器人是不是逻辑有问题&#xff1f;如下图&#xff1a; 名字脱敏了哈。。。 照片比较多&…