STL

什么是STL?

C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

vector

向量:与数组十分相似,唯一不同的是,向量在需要扩展大小的时候,会自动处理它自己的存储需求,相当于一个自动的动态数组

头文件

#include<vector>

基本方法

函数 作用
vector.push_back(T)

queue

队列:先进先出的一种结构,就类似于生活中排队打饭,排在排头的人先打到饭菜离开

头文件

#include<queue>

基本方法

函数 作用
queue.pop() 弹出队首的元素
queue.push(T) 队尾加入一个元素
queue.front() 队首元素
queue.empty() 队列是否为空
queue.size() 队列的大小
queue.back() 队尾元素

示例

输入格式

一行内输入一串整数,以0结束,以空格间隔。

输出格式

按照输入顺序输出这一串数字,以空格间隔

样例

样例输入
12 26 3 10 20 0
样例输出
12 26 3 10 20
代码实现
//先进先出,使用队列
#include<iostream>
#include<queue>//头文件

using namespace std;

int main()
{
int cnt[100];
int i = 0;
queue<int> q;//初始化队列
while(cin >> cnt[i]){
if(cnt[i] == 0){
break;
}
q.push(cnt[i]);//队尾加入元素
i++;
}
while(!q.empty()){//判断队列是否为空
cout << q.front() << " ";//输出队首元素
q.pop();//弹出队首元素
}
return 0;
}

输入

12 26 3 10 20 0

输出

12 26 3 10 20

deque

双队列:不同于queue,双队列的队首以及队尾均可对元素进行增删改查

头文件

#include<deque>

基本方法

基本操作 函数 作用
插入操作 deque.push_front(T) 队首插入元素
deque.push_back(T) 队尾插入元素
deque.insert(pos, val) 指定位置pos,插入元素val
deque.insert(pos, n, val) 在指定位置pos插入n个元素val
deque.insert(pos, deque2.begin(), deque2.end()) 在pos位置插入另一个队列(左闭右开)
删除操作 deque.pop_front() 弹出队首元素
deque.pop_back() 弹出队尾元素
deque.clear() 清空队列所有元素
deque.erase(pos) 删除pos对应位置数据
deque.erase(begin, end) 删除该区间上的元素(左闭右开)
存取操作 deque.back() 访问队尾元素
deque.front() 访问队首元素
deque.at(index) 访问指定下标的元素
deque[i] 访问指定下标元素
容量操作 deque.empty() 判断是否为空
deque.size() 双队列中元素的个数
deque.resize(num) 重新指定双队列的大小,不足以默认值填充,超过删除超过部分
deque.resize(num, val) 重新指定双队列的大小,不足以val填充,超过删除超过部分
排序操作 sort(itr.begin(), itr.end()) 对其中元素进行排序

双向队列

输入格式

一行输入一个数字N用于表示数组大小,输入N个数字

输出格式

以双向列表的形式通过三种不同方式输出数组中所有元素

样例

样例输入
6
10 6 260 1000 36 0
样例输出
10 6 260 1000 36 0
10 6 260 1000 36 0
10 6 260 1000 36 0
代码实现
#include<iostream>
#include<deque>//头文件

using namespace std;

int main()
{
deque<int> d;//初始化双向队列
int num;
cin >> num;
int *n = new int[num];//new 一块内存空间申请动态数组
for(int i = 0; i < num; i++)
{
cin >> n[i];
d.push_back(n[i]);//双队列结尾插入元素
}
for(int i = 0; i < d.size(); i++)//获取双向队列中元素个数
{
cout << d[i] << " ";//以下标方式访问元素
}
cout << endl;
for(int i = 0; i < d.size(); i++)
{
cout << d.at(i) << " ";//以at方式访问元素
}
cout << endl;
for(deque<int>::iterator it = d.begin(); it != d.end(); it++)//迭代器
{
cout << *it << " ";//以迭代器方式访问元素
}
return 0;
}

输入

6
10 6 260 1000 36 0

输出

10 6 260 1000 36 0
10 6 260 1000 36 0
10 6 260 1000 36 0

stack

栈:先进后出的一种结构,现实生活中类似于从下至上叠加椅子,将椅子从上至下取下的过程

头文件

#include<stack>

基本方法

函数 作用
stack.pop() 弹栈
stack.push(T) 压栈
stack.top() 栈顶元素
stack.empty() 栈是否为空
stack.size() 栈的大小

数字游戏

输入格式

一行内输入一串整数,以 0 结束,以空格间隔。

输出格式

一行内倒着输出这一串整数,以空格间隔。

样例

样例输入
3 65 23 5 34 1 30 0
样例输出
30 1 34 5 23 65 3
代码实现
//先进后出,经典栈结构
#include<iostream>
#include<stack>

using namespace std;

int main()
{
int cnt[100];
int i = 0;
stack<int> s;//定义栈
while(cin >> cnt[i]){
if(cnt[i] == 0){
break;
}
s.push(cnt[i]);//压栈
i++;
}
while(!s.empty()){//判断栈是否为空
cout << s.top() << " ";//输出栈顶元素
s.pop();//弹栈
}
return 0;
}

输入

3 65 23 5 34 1 30 0

输出

30 1 34 5 23 65 3