其中有几个常见又好用的容器:stack(栈),vector(动态数组),set(集合),map(映射)。
1.栈(stack)


做一道与栈有关的题目:
验证栈序列
时空限制:1s,512MB
题目描述:
给出 pushed 和 poped 两个序列,其取值从 1 到 n(n≤100000)。
已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes,否则输出 No。
每个测试点有多组数据。
输入格式:
第一行输入一个正整数 T,表示数据组数。
对于每组数据,第一行输入一个正整数 n;
第二行输入 n 个正整数,表示入栈序列;
第三行输入 n 个正整数,表示出栈序列。
输出格式:
对于每组数据单独输出一行 Yes 或 No。
样例输入:
2 5 1 2 3 4 5 4 5 3 2 1 5 1 2 3 4 5 3 5 2 4 1
样例输出:
Yes No
数据规模:
n ≤ 100000
伪代码:
2.队列(queue)

做一道与队列有关的题:
合并果子
时间限制:1s 空间限制:128M
题目描述:
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了 n 堆。多多决定把所有的果子合成一堆。
每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过 n−1 次合并之后, 就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为 1 ,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
例如有 3 种果子,数目依次为 1 , 2 , 9 。可以先将 1 、 2 堆合并,新堆数目为 3 ,耗费体力为 3 。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 12 ,耗费体力为 12 。所以多多总共耗费体力 3+12=15 。可以证明 15 为最小的体力耗费值。
输入格式:
第一行是一个整数 n(1≤n≤1e5),表示果子的种类数。
第二行包含 n 个整数,用空格分隔,第 i 个整数 ai(1≤ai≤1e9) 是第 i 种果子的数目。
输出格式:
一个整数,也就是最小的体力耗费值。
样例输入:
3 1 2 9
样例输出:
15
#include <bits/stdc++.h>
using namespace std;
long long n,x,y,a,ans;
priority_queue<int,vector<int>,greater<int> > que;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a);
que.push(a);
}
while(!que.empty()){
if(que.size()==1){
break;
}
x=que.top();
que.pop();
y=que.top();
que.pop();
ans+=x+y;
que.push(x+y);
}
printf("%lld",ans);
return 0;
}
3.动态数组(vector)
定义
初始化

vector一般有两种访问方式:

做一道与动态数组有关的题目:
矩阵
时间限制:1s 空间限制:512M
题目描述:
给定一个 n×m 的矩阵,给定 q 组询问,每组询问输入两个数 x 和 y,表示查询矩阵 x 行 y 列的元素是什么。
输入格式:
第一行三个正整数 n, m, q;
接下来 n 行,每行 m 个正整数,表示矩阵中的元素。其中第 i 行第 j 列的元素表示 ai−1,j−1。
接下来 q 行,每行两个正整数 x, y,表示询问第 x 行第 y 列的元素是什么。保证 0≤x
样例输入:
3 4 2 1 2 3 4 5 6 7 8 9 10 11 12 1 3 0 2
样例输出:
8 3
数据规模:
1≤n,m,q≤105, 1≤n⋅m≤105,0<ai,j<109
伪代码:
4.set


5.映射(map)


























