寒假集训一期(4)——STL容器整理合集(上)
这几天学了STL,写篇blog总结一下,以便后续作参考
文章目录
- 一、 vector 动态数组
- 常见操作
- 如何定义二维vector
- 结构体二维vector
- 二、栈
- 基本操作
- 三、队列
- 基本操作
- 双端队列
- 优先队列
一、 vector 动态数组
简单来说,vector是一个没有长度限制的数组,也叫不定长数组。
常见操作
函数 | 功能 |
---|---|
c.clear() | 移除容器中所有数据 |
c.empty() | 判断容器是否为空 |
c.erase(pos) | 删除pos位置的数据 |
c.erase(begin,end) | 删除[begin,end]区间的数据 |
c.front() | 传回第一个数据 |
c.insert(pos,elem) | 在pos位置插入一个elem拷贝 |
c.pop_back() | 删除最后一个数据 |
c.push_back(elem) | 在尾部加入一个数据 |
c.resize(num) | 重新设置该容器的大小 |
c.size() | 返回容器中实际数据的个数 |
c.begin() | 返回指向容器第一个元素的迭代器 |
c.end() | 返回指向容器最后一个元素的迭代器 |
如何定义二维vector
有两种方法:
法一:
int n = 5, m = 6;
vector<vector<int>> obj(n);//定义类型为vector的vector
for(int i = 0; i < obj.size(); i++){
obj[i].resize(m);//实现二维
}
法二:
int n = 5, m = 6;
vector<vector<int>> obj(n, vector<int>(m));//直接定义二维
结构体二维vector
定义一个类型为结构体名字的vector即可
struct node{
int x, y, z;
}tmp;
vector<node>a;//这里的node就是结构体上的node
二、栈
栈是一种先进后出的数据结构,先进去的元素会被压到栈底,从而实现先进后出,就像乒乓球盒一样。
基本操作
操作 | 代码 | 解释 |
---|---|---|
入栈 | s.push(x) | 将x元素入栈 |
出栈 | s.pop() | 弹出栈的第一个元素 |
栈顶元素 | s.top() | 获取栈的第一个元素 |
元素个数 | s.size() | 获取栈中元素个数, 返回值为int |
判空 | s.empty() | bool类型,为空返回1,否则返回0 |
三、队列
队列是一种先进先出的数据结构
基本操作
操作 | 代码 | 解释 |
---|---|---|
入队 | s.push(x) | 将x元素入队列 |
出队 | s.pop() | 弹出队列的第一个元素 |
队首元素 | s.front() | 获取队列的第一个元素 |
队尾元素 | s.back() | 获取队列的最后一个元素 |
元素个数 | s.size() | 获取队列中元素个数, 返回值为int |
判空 | s.empty() | bool类型,为空返回1,否则返回0 |
双端队列
顾名思义,可以从两边进,两边出
操作 | 解释 |
---|---|
push_back() | 在队尾压入元素 |
push_front(): | 在队头压入元素 |
pop_back(): | 删除最后一个元素 |
pop_front(): | 删除第一个元素 |
front(): | 返回第一个元素的引用 |
back(): | 返回最后一个元素的引用 |
优先队列
优先队列是队列的一种,他是自动帮我们排序的,内部结构是大根堆,常见操作与一般的队列一样,但是定义方式有所不同
如:prioriyt_queue<int> q;
此外,我们经常为了适应题目背景,重载优先队列的排序顺序,一般是在结构体内实现的,大致如下
struct cmp{
bool operator ()(int a, int b){
return (a % 100) > (b % 100);
}
};
void main(){
priority_queue<int , vector<int>, cmp >q;
}
如果想要把结构体与优先队列结合起来,那么就需要重载小于符号,具体思想和上面差不多,格式如下:
struct node{
int x, y;
bool operator < (const node &a) const{
//这里的node和结构体名字一样
return x < a.x;
}
};
除了定义在结构体以内,也可以定义一个专门用来做比较的结构体,只需要把刚刚重载运算符的部分提到cmp函数内,然后在定义有限队列是加上cmp即可,如下:
struct node{
int to, cost;
};
struct cmp{
bool operator ()(node a, node b){
return a.cost > b.cost;
}
};
priority_queue<node, vector<node>, cmp> priq;