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

ʕ • ᴥ • ʔ

づ♡ど

🎉 欢迎点赞支持🎉

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

专栏主页: C++语言


文章目录

前言

[一、标准库中的 stack/queue 类](#一、标准库中的 stack/queue 类)

[二、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的构造函数。

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

cpp 复制代码
int main()
{
	stack<int> x;
	return 0;
}

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

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

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

cpp 复制代码
int main()
{
	stack<int, vector<int>> x;
	return 0;
}

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

cpp 复制代码
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也是同理。

cpp 复制代码
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、赋值重载

cpp 复制代码
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 函数,由于栈和队列的结构特性,一个只能先进先出,一个是后进先出,所以就没有那么多插入方法。

cpp 复制代码
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函数

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

cpp 复制代码
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 都有,就是判空。

cpp 复制代码
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 也是都有的,就是返回里面还有多少个元素的。

cpp 复制代码
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 独有的一个函数,这个函数的作用就是返回最上面的那个元素,也就是返回最后插入的那个元素,由于是引用返回,所以我们是可以修改的。

cpp 复制代码
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差不多,都是引用返回,也可以修改,一个是返回头部元素,一个是返回尾部元素的。

cpp 复制代码
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 的主要成员函数的用法,看上去并不是特别复杂。我们下一章节再来细聊这个容器适配器到底是什么,以及模拟实现。大家下一章节再见。

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

ʕ • ᴥ • ʔ

づ♡ど

相关推荐
Scott9999HH5 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
2401_841495646 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
fqbqrr6 小时前
2607C++,soui与安卓
c++·soui
码智社6 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海6 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖7 小时前
JDK 26 新特性详解
java·开发语言
马优晨8 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
a1117769 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
我的xiaodoujiao9 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
fqbqrr9 小时前
2607C++,使用微软detours勾挂工具
c++