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 的主要成员函数的用法,看上去并不是特别复杂。我们下一章节再来细聊这个容器适配器到底是什么,以及模拟实现。大家下一章节再见。
🎇坚持到这里已经很厉害啦,辛苦啦🎇
ʕ • ᴥ • ʔ
づ♡ど