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

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

ʕ • ᴥ • ʔ

づ♡ど

相关推荐
努力努力再努力wz3 小时前
【c++进阶系列】:万字详解异常
java·linux·运维·服务器·开发语言·c++
Peter_Deng.3 小时前
C语言 - 输出参数详解:从简单示例到 alloc_chrdev_region
c语言·开发语言
fhgfyrsg4 小时前
synchronized的锁对象 和 wait,notify的调用者之间的关系
java·开发语言
~kiss~4 小时前
MCP SDK 示例一
学习
西红柿维生素4 小时前
Junior Engineer浅谈CAS
java·开发语言·数据结构
lxl13074 小时前
学习数据结构(15)插入排序+选择排序(上)
数据结构·学习·排序算法
俞凡4 小时前
Go/C++ 指针比较
c++·go
自由生长20244 小时前
cpp-负整数如何转换成无符号整数?-反码和移码的发现
c++
自由生长20244 小时前
cpp-string::size_type的作用
c++