[STL]stack和queue使用介绍

news2024/9/21 15:11:52

[STL]stack和queue使用介绍

文章目录

  • [STL]stack和queue使用介绍
    • stack使用介绍
      • stack介绍
      • 构造函数
      • empty函数
      • push函数
      • top函数
      • size函数
      • pop函数
    • queue使用介绍
      • queue介绍
      • 构造函数
      • empty函数
      • push函数
      • front函数
      • back函数
      • size函数
      • pop函数
    • deque介绍

stack使用介绍

stack介绍

  1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。
  2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
  3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:
    • empty:判空操作
    • back:获取尾部元素操作
    • push_back:尾部插入元素操作
    • pop_back:尾部删除元素操作
  4. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器, 默认情况下使用deque

构造函数

stack只有默认构造函数,构造一个空栈。

stack<int> st;

同样是构造一个空栈,stack还可以指定底层容器进行构造。

stack<int, vector<int>> st;

empty函数

empty函数用于判断stack是否为空。

#include <iostream>
#include <stack>
using namespace std;
int main()
{
	stack<int> st;
	cout << st.empty() << endl; //输出为1
	return 0;
}

push函数

push函数用于往stack中压入数据。

#include <iostream>
#include <stack>
using namespace std;
int main()
{
	stack<int> st;
	st.push(1);
	st.push(2);
	st.push(3);
	cout << st.empty() << endl; //输出为0
	return 0;
}

top函数

top函数用于获取stack的顶部数据。

#include <iostream>
#include <stack>
using namespace std;

int main()
{
	stack<int> st;
	st.push(1);
	st.push(2);
	st.push(3);
	cout << st.top() << endl; //输出为3
	return 0;
}

size函数

size函数用于获取stack内的数据个数。

#include <iostream>
#include <stack>
using namespace std;

int main()
{
	stack<int> st;
	st.push(1);
	st.push(2);
	st.push(3);
	cout << st.size() << endl; //输出为3
	return 0;
}

pop函数

pop函数用于弹出stack顶部的数据。

#include <iostream>
#include <stack>
using namespace std;

int main()
{
	stack<int> st;
	st.push(1);
	st.push(2);
	st.push(3);
	st.pop();
	cout << st.top() << endl; //输出为2
	return 0;
}

queue使用介绍

queue介绍

  1. queue是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端 提取元素。
  2. queue作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的 成员函数来访问其元素。元素从队尾入队列,从队头出队列。
  3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:
    • empty:检测队列是否为空
    • size:返回队列中有效元素的个数
    • front:返回队头元素的引用
    • back:返回队尾元素的引用
    • push_back:在队列尾部入队列
    • pop_front:在队列头部出队列
  4. 标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则默认使用标准容器deque

构造函数

queue只有默认构造函数,构造一个空队列。

queue<int> q;

同样是构造一个空队列,queue还可以指定底层容器进行构造。

queue<int, list<int>> q;

empty函数

empty函数用于判断queue是否为空。

#include <iostream>
#include <queue>
using namespace std;
int main()
{
	queue<int> q;
	cout << q.empty() << endl; //输出为1
	return 0;
}

push函数

push函数用于往将数据尾插至队列。

#include <iostream>
#include <queue>
using namespace std;
int main()
{
	queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);
	cout << q.empty() << endl; //输出为0
	return 0;
}

front函数

front函数用于获取队头的数据。

#include <iostream>
#include <queue>
using namespace std;
int main()
{
	queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);
	cout << q.front() << endl; //输出为1
	return 0;
}

back函数

back函数用于获取队尾的数据。

#include <iostream>
#include <queue>
using namespace std;
int main()
{
	queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);
	cout << q.back() << endl; //输出为3
	return 0;
}

size函数

size函数用于获取队列内的数据个数。

#include <iostream>
#include <queue>
using namespace std;
int main()
{
	queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);
	cout << q.size() << endl; //输出为3
	return 0;
}

pop函数

pop函数用于删除队头的数据。

#include <iostream>
#include <queue>
using namespace std;
int main()
{
	queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);
	q.pop();
	cout << q.front() << endl; //输出为2
	return 0;
}

deque介绍

STL中stack和list的底层实现都使用的是deque容器。

deque(双端队列)兼容了vector和list的使用接口,使得deque可以在头尾两端进行插入和删除操作,并且还支持数据的随机访问。deque的结构示意图如下:

image-20230730165637318

deque设计了一个中控数组,往中控数组中插入数据需要从中间开始插入,然后从中间开始进行头插和尾插,中控数组中的结点存储着指针,指向一段连续的空间,中控数据空间不够了会进行扩容,并将原有数据拷贝。由于每个结点指向的连续空间内存储的数据个数和容量是已知的,因此要进行随机访问,可以通过计算得到相应的结点和连续空间内的相应位置来实现,当然往deque内中间位置插入数据也是从中间结点指向的空间开始插入,向deque头插(删)或尾插(删)只需要从中控数据的头结点和尾结点寻找数据,在指向的空间内找到对应位置进行操作。

优点:

  • 相比vector, 扩容代价更低。
  • 头插头删、尾插尾删效率相对vector更高,且时间复杂度为O(1)。
  • 相比list,空间利用率比较高。
  • 支持随机访问。

缺点:

  • 中间部分的数据的插入和删除存在取舍问题 – 保持随机访问的效率,会降低头尾数据操作的效率;保持头尾数据操作的效率,会降低随机访问的效率。
  • 优点方面的表现没有vector或list突出。

deque迭代器示意图如下:

image-20230730171911724

deque迭代器包含四个指针:

  • cur – 指向当前数据
  • first – 指向连续空间的开始位置
  • last – 指向连续空间的结束位置
  • node – 指向中控数组当前使用的结点位置

stack和queue选择deque的原因:

  1. stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。
  2. 在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据);queue中的元素增长 时,deque不仅效率高,而且内存使用率高。

总结: stack和queue使用deque发挥了其优点,规避了其缺点,使得效率在各种场景下都保持一定的水准。

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

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

相关文章

C++中的static修饰类的成员变量和成员函数

回顾一下C语言中static的描述&#xff0c;我们知道&#xff1a; 当static修饰局部变量时&#xff0c;使局部变量的生命周期延长.static修饰全局变量时&#xff0c;将外部链接属性变成了内部链接属性&#xff0c;使全局变量的作用域只能在该源文件中执行.static修饰函数时&#…

时序预测 | Python实现NARX-DNN空气质量预测

时序预测 | Python实现NARX-DNN空气质量预测 目录 时序预测 | Python实现NARX-DNN空气质量预测效果一览基本介绍研究内容程序设计参考资料效果一览 基本介绍 时序预测 | Python实现NARX-DNN空气质量预测 研究内容 Python实现NARX-DNN空气质量预测,使用深度神经网络对比利时空气…

西安市未央区地方财政支出绩效管理研究_kaic

摘 要 目前传统的地方财政绩效管理研究普遍上主要集中在有关收入研究方面上&#xff0c;而对其支出的规模以及各类结构的研究较少。我国大部分地方财政政府的财政收入低下&#xff0c;财政支出效率有限&#xff0c;不能很好的为其地方经济提供较为稳定的社会支撑和经济保障。造…

6.1.tensorRT高级(1)-概述

目录 前言1. tensorRT高级概述总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-概述 课程大纲可看下面的思维…

【C++】入门 --- 缺省参数函数重载

文章目录 &#x1f96e;一、缺省参数&#x1f355;1、基本概念&#x1f355;2、缺省参数的分类&#x1f6a9;全缺省参数&#x1f6a9;半缺省参数&#x1f6a9;缺省参数实用案例 &#x1f96e;二、函数重载&#x1f355;1、函数重载概念1️⃣参数类型不同2️⃣参数个数不同3️⃣…

MySQL 数据库 【增删查改(二)】

目录 一、表的设计 1、一对一 2、一对多 3、多对多 二、新增 三、查询 1、聚合查询 &#xff08;1&#xff09;聚合函数&#xff1a; &#xff08;2&#xff09; group by 子句 &#xff08;3&#xff09;having 2、联合查询 (1)内连接 (2)外连接 (3)自链接 (4)…

web前端开发工程师的具体职责范本(合集)

web前端开发工程师的具体职责范本1 职责&#xff1a; 1.负责web前端架构的搭建&#xff0c;核心业务功能开发和核心代码编写。 2.配合产品经理&#xff0c;实现产品UI和交互方面的需求&#xff0c;持续界面优化&#xff0c;提升用户体验。 3.参与相关业务需求变更评审。 4.…

【动态规划part14】| 1143.最长公共子序列、1035.不相交的线、53.最大子序和

目录 &#x1f388;LeetCode1143.最长公共子序列 &#x1f388;LeetCode1035.不相交的线 &#x1f388;LeetCode53.最大子序和 &#x1f388;LeetCode1143.最长公共子序列 链接&#xff1a;1143.最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的…

线程操作——创、取、终、分、连

文章目录 线程相关函数线程创建注意&#xff1a; 线程终止线程ID获取线程比较连接终止线程——回收资源线程分离——终止后自动回收资源线程取消——中途终止 线程相关函数 main函数执行的线程叫主线程&#xff08;main线程)&#xff0c;其余创建出来的叫子线程。 线程创建 这…

mybatisplus的id生成策略失效问题

mybatisplus3.4.2 id的默认生成策略是雪花算法 问题重现&#xff1a;无论我设置 yml为 mybatis-plus:global-config:db-config:id-type: auto还是在id的实体类上加入 TableId(type IdType.ASSIGN_ID) 都不起作用 现在直接说结论&#xff0c;原因是之前没有设置生成策略默认生…

【Qt】Qt 实现图像格式转图标 ico 格式的程序

【Qt】Qt 实现图像格式转图标 ico 格式的程序 文章目录 【Qt】Qt 实现图像格式转图标 ico 格式的程序核心代码编写应用程序1. 设计界面2. 头文件3. 源文件 核心代码 此程序得核心代码既是&#xff0c;使用 QImage 打开图片文件&#xff0c;并保存为 ICO 格式。 QImage img(so…

Stable Diffusion 硬核生存指南:WebUI 中的 VAE

本篇文章聊聊 Stable Diffusion 生态中呼声最高、也是最复杂的开源模型管理图形界面 “stable-diffusion-webui” 中和 VAE 相关的事情。 写在前面 Stable Diffusion 生态中有一个很重要的项目&#xff0c;它对于 SD 生态繁荣做出的贡献可以说居功至伟&#xff0c;自去年八月…

操作系统_进程与线程(二)

目录 2. 处理机调度 2.1 调度的基本概念 2.2 调度的层次 2.3 三级调度的联系 2.4 调度的目标 2.5 调度的实现 2.5.1 调度程序&#xff08;调度器&#xff09; 2.5.2 调度的时机、切换与过程 2.5.3 进程调度方式 2.5.4 闲逛进程 2.5.5 两种线程的调度 2.6 典型的调度…

服务调用---------Ribbon和Feign

1、Ribbon 1.1 Ribbon简介 Ribbon是一个用于客户端负载均衡的组件&#xff0c;它是Netflix开源的一个项目。在微服务架构中&#xff0c;系统会拆分为多个小型的服务&#xff0c;每个服务都有自己独立的服务器实例。Ribbon所具有的特点&#xff1a;客户端负载均衡&#xff0c;将…

批量插入数据、MVC三层分离

八、批量插入数据 1、使用Statement&#xff08;&#xff09; 2、使用PreparedStatement() 3、使用批量操作API 4、优化 九、MVC三层分离

Java中static关键字的作用

文章目录 一、使用static关键字修饰成员变量&#xff1a;二、使用static关键字修饰成员方法&#xff1a;三、使用static关键字定义静态代码块&#xff1a;四、使用static关键字定义内部类&#xff1a;五、使用静态导包&#xff1a;六、总结&#xff1a;static关键字在Java中有多…

大数据课程D7——hadoop的YARN

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解YARN的概念和结构&#xff1b; ⚪ 掌握YARN的资源调度流程&#xff1b; ⚪ 了解Hadoop支持的资源调度器&#xff1a;FIFO、Capacity、Fair&#xff1b; ⚪ 掌握YA…

Python语法(一、基础)

简介 Python 是一个高层次的结合了解释性、交互性和面向对象的脚本语言。解释型语言&#xff1a; 这意味着开发过程中没有了编译这个环节。作为解释型语言&#xff0c;意味着开发过程中没有了编译这个环节&#xff0c;对代码逐行解析。 Python还具有可嵌入性&#xff0c;如Py…

ConcurrentHashMap基本介绍

介绍 ConcurrentHashMap是线程安全且高效的HashMap。 为什么要使用ConcurrentHashMap 线程不安全的HashMap HashMap多线程情况下put操作会出现并发安全问题&#xff0c;包括死循环、数据丢失&#xff08;jdk7&#xff09;以及数据覆盖&#xff08;jdk8&#xff09;。 jdk7中…

基于stm32单片机的直流电机速度控制——LZW

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、实验目的二、实验方法三、实验设计1.实验器材2.电路连接3.软件设计&#xff08;1&#xff09;实验变量&#xff08;2&#xff09;功能模块a&#xff09;电机接收信号…