当前位置: 首页 > ds >正文

STL库——stack/queue(类函数学习)

ʕ • ᴥ • ʔ

づ♡ど

 🎉 欢迎点赞支持🎉

个人主页:励志不掉头发的内向程序员;

专栏主页:C++语言;


文章目录

前言

一、标准库中的 stack/queue 类

二、stack/queue 的成员函数

2.1、构造函数

2.2、赋值重载

2.4、插入和删除

2.4.1、push函数

2.4.2、pop函数

2.5、其他成员函数

2.5.1、empty函数(共有)

2.5.2、size函数(共有)

2.5.3、top函数(stack有)

2.5.4、front/back函数(queue有)

总结


前言

我们已经学完 string、vector、list 三个容器了,我们本章节我们就来学习一下我们 stack 和 queue的成员函数,都十分的简单好上手,我们一起来瞅瞅吧。


一、标准库中的 stack/queue 类

我们来看看 stack/queue 的标准库就会发现它们的标准库相当的简单。

stack:

queue:

总共就没有几个成员函数。

二、stack/queue 的成员函数

同样的,这两个类都保存在 stack/queue 的头文件中

#include <stack>

#include <queue>

我们得知道,我们 stack/queue 虽然放在了容器一栏中,但是它们其实并不是容器,而是叫做容器适配器。

我们可以看到,我们别的容器后面的参数一般是空间配置器,但是 stack/queue 却不是,它们是一个容器,且有个缺省参数是 deque<T>,这也就是它们默认适配的容器了。

2.1、构造函数

我们先来看看stack的构造函数。

十分简单,就只实现了一个默认构造。

int main()
{stack<int> x;return 0;
}

这样就是 stack 的构造函数了,我们想要去给 stack有一些初始值初始化怎么做呢,我们写值写到()里吗,我们可以来试试。

报错了,那我们构造函数的参数是什么东西呢?

我们前面说了 stack/queue 不算是容器,而是容器适配器,这个意思就是它们类的实现其实是在各种容器的基础上实现了,你可以理解为在容器的外面套了一层壳就是 queue/stack。而这个里面的容器默认是 deque,我们也可以改成 vector。

int main()
{stack<int, vector<int>> x;return 0;
}

也就是说我们的 stack/queue 构造函数本质上就是在它们里面的容器的构造的改变而来,我们可以返回一个这个容器的构造去构造我们 stack/queue 的构造。

int main()
{vector<int> a(1, 10);stack<int, vector<int>> x(a);list<int> b({ 1, 2, 3, 4, 5 });stack<int, list<int>> x(b);return 0;
}

我们queue也是同理。

int main()
{queue<int> x;vector<int> a(1, 10);queue<int, vector<int>> y(a);list<int> b({ 1, 2, 3, 4, 5 });queue<int, list<int>> z(b);return 0;
}

大家不理解也没有关系,我们下一章节讲解模拟实现时大家就会明白了。

2.2、赋值重载

int main()
{vector<int> a(1, 10);stack<int, vector<int>> sx(a);stack<int, vector<int>> sy;queue<int, vector<int>> qx(a);queue<int, vector<int>> qy;sy = sx;qy = qx;return 0;
}

我们 stack/queue 明明没有写赋值重载但是却可以实现,这是为什么呢?这是因为 stack/queue 的底层的容器它是支持的,在这里它们的底层是 vector,所以它们是通过 vector 的赋值重载而实现赋值操作的。

2.4、插入和删除

2.4.1、push函数

stack/queue 有专门用来插入的函数,那就是 push 函数,由于栈和队列的结构特性,一个只能先进先出,一个是后进先出,所以就没有那么多插入方法。

int main()
{stack<int> sa;queue<int> qa;sa.push(1);sa.push(2);qa.push(10);qa.push(20);return 0;
}

由于它们没有提供迭代器,所以不好打印,我在调试时打印看看。

2.4.2、pop函数

删除也是同理,没有什么头删和尾删,就只有一个删除。

int main()
{stack<int> sa;queue<int> qa;sa.push(1);sa.push(2);qa.push(10);qa.push(20);sa.pop();qa.pop();return 0;
}

删除前:

删除后:

栈后进先出,所以 2 没了,队列先进先出,所以 10 没了。

2.5、其他成员函数

2.5.1、empty函数(共有)

这个函数 queue/stack 都有,就是判空。

int main()
{stack<int> sa;queue<int> qa;sa.push(1);if (sa.empty()) cout << "YES" << endl;else cout << "NO" << endl;qa.push(10);if (qa.empty()) cout << "YES" << endl;else cout << "NO" << endl;sa.pop();qa.pop();if (sa.empty()) cout << "YES" << endl;else cout << "NO" << endl;if (qa.empty()) cout << "YES" << endl;else cout << "NO" << endl;return 0;
}

2.5.2、size函数(共有)

这个函数 stack/queue 也是都有的,就是返回里面还有多少个元素的。

int main()
{stack<int> sa;queue<int> qa;sa.push(1);sa.push(2);sa.push(3);qa.push(10);qa.push(20);qa.push(30);qa.push(40);cout << sa.size() << endl;cout << qa.size() << endl;return 0;
}

2.5.3、top函数(stack有)

这是我们 stack 独有的一个函数,这个函数的作用就是返回最上面的那个元素,也就是返回最后插入的那个元素,由于是引用返回,所以我们是可以修改的。

int main()
{stack<int> sa;sa.push(1);sa.push(2);sa.push(3);cout << sa.top() << endl;sa.top() = 20;cout << sa.top() << endl;return 0;
}

2.5.4、front/back函数(queue有)

这是 queue 有而 stack 没有的函数,和top差不多,都是引用返回,也可以修改,一个是返回头部元素,一个是返回尾部元素的。 

int main()
{queue<int> qa;qa.push(10);qa.push(20);qa.push(30);qa.push(40);cout << qa.front() << " " << qa.back() <<endl;qa.front() = 1;qa.back() = 999;cout << qa.front() << " " << qa.back() << endl;return 0;
}


总结

以上便是我们 queue/stack 的主要成员函数的用法,看上去并不是特别复杂。我们下一章节再来细聊这个容器适配器到底是什么,以及模拟实现。大家下一章节再见。

🎇坚持到这里已经很厉害啦,辛苦啦🎇

ʕ • ᴥ • ʔ

づ♡ど

http://www.xdnf.cn/news/19535.html

相关文章:

  • 切片语法[::-1]及其可用的类型
  • 基于STM32设计的智能家居控制系统(华为云IOT)_275
  • 2023年IEEE IOTJ SCI1区TOP,动态环境下无人机目标覆盖任务路径规划,深度解析+性能实测
  • KingbaseES JDBC 驱动详解:连接、配置与最佳实践
  • 介绍Ansible和实施Ansible PlayBook
  • pinia状态管理工具
  • Redis核心原理与Java应用实践
  • 洞悉边界:软件测试中边界值分析的艺术与科学
  • OpenJDK 17 解释器分发表与安全点表机制解析
  • 零基础入门AutoSar中的ARXML文件
  • 【Flask】测试平台开发,产品管理功能UI重构-第九篇
  • Kubernetes 服务发现与健康检查详解
  • 搭建卷积神经网络
  • 软考 系统架构设计师系列知识点之杂项集萃(139)
  • C++11语言(三)
  • Nginx实现P2P视频通话
  • codecombat(Ubuntu环境详细docker部署教程)
  • 项目-云备份
  • 面试 八股文 经典题目 - HTTPS部分(一)
  • Flink NettyBufferPool
  • 大模型时代:用Redis构建百亿级向量数据库方
  • EtherCAT主站IGH-- 41 -- IGH之sdo_request.h/c文件解析
  • Library cache lock常见案例分析(一)
  • Encoder编码器
  • 图像描述编辑器 (Image Caption Editor)
  • 极客时间AI 全栈开发实战营毕业总结(2025年8月31日)
  • 【Linux基础】深入理解计算机存储:GPT分区表详解
  • 前端组件拆分与管理实战:如何避免 props 地狱,写出高可维护的项目
  • 《Unity Shader入门精要》学习笔记四(高级纹理)
  • ing Data JPA 派生方法 数据操作速查表