STL常用容器
queue (队列)
queue <int> q
常见应用场景
-
BFS (广度优先搜索)
-
模拟排队过程
-
滑动窗口问题
对应的函数方法
push(x)
- 在队尾插入元素xpop()
- 删除队首元素front()
- 返回队首元素back()
- 返回队尾元素empty()
- 判断队列是否为空size()
- 返回队列中元素个数
应用举例
(BFS模板)
借助队列现进先出的特点,每层判断完在判断下层,实现广度优先。
void bfs(int x,int y){
q.push({x,y});//借助队列
while(q.size()){
f=q.front();//每次取出首元素
q.pop();
if(f.x==fx&&f.y==fy)//达到题目要求后返回答案
return;
for(int i=0;i<4;i++){//(四个方向)按题意下一步的操作
int tx=f.x+dx[i];
int ty=f.y+dy[i];
if(a[tx][ty]&&s[tx][ty]==0){//判断下一步是否合法
q.push({tx,ty});//合法加入队列
s[tx][ty]=s[f.x][f.y]+1;//将下一步的步数打上+1
}
}
}
return;
}
priority_queue (优先队列)
priority_queue<int,vector<int>,(less<int> / greater<int>) > q
常见应用场景
- Dijkstra算法
- 哈夫曼编码
- 需要动态获取最大值/最小值的场景
对应的函数方法
push(x)
- 插入元素xpop()
- 删除顶部元素top()
- 返回顶部元素(最大或最小)empty()
- 判断是否为空size()
- 返回元素个数
应用举例
[P1090 NOIP 2004 提高组] 合并果子 - 洛谷
// 默认是大顶堆
priority_queue <int> max_p;
// 小顶堆定义方式
priority_queue <int, vector<int>, greater<int>> min_p;
stack (栈)
stack <int> s
常见应用场景
- DFS (深度优先搜索)
- 表达式求值(后缀表达式)
- 括号匹配
- 单调栈问题
对应的函数方法
push(x)
- 压入元素xpop()
- 弹出顶部元素top()
- 返回顶部元素empty()
- 判断是否为空size()
- 返回元素个数
应用举例
// 括号匹配
stack<char> s;
for (char c : str) {
if (c == '(' || c == '[' || c == '{') {
s.push(c);
} else {
if (s.empty() || !is_match(s.top(), c)) return false;
s.pop();
}
}
set (集合)
set <int> s
常见应用场景
- 维护有序不重复元素
- 需要频繁查找/插入/删除的场景
- 需要前驱/后继操作的场景
对应的函数方法
-
insert(x)
- 插入元素x -
erase(x)
- 删除元素x -
find(x)
- 查找元素x,返回迭代器 -
count(x)
- 返回x是否存在(0或1) -
lower_bound(x)
- 返回第一个≥x的迭代器 -
upper_bound(x)
- 返回第一个>x的迭代器 -
empty()
- 判断是否为空 -
size()
- 返回元素个数 -
begin()/end()
- 迭代器
应用举例
set<int> s;
s.insert(3);
s.insert(1);
s.insert(4);
// s现在是 {1, 3, 4}
auto it = s.lower_bound(2); // 指向3
map (映射)
map <int,int> m
常见应用场景
- 键值对存储
- 需要按键排序的场景
- 频率统计
对应的函数方法
insert({key, value})
- 插入键值对erase(key)
- 删除键为key的元素find(key)
- 查找键为key的元素count(key)
- 返回键是否存在(0或1)lower_bound(key)
- 返回第一个键≥key的迭代器upper_bound(key)
- 返回第一个键>key的迭代器empty()
- 判断是否为空size()
- 返回元素个数begin()/end()
- 迭代器
应用举例
map<string, int> m;
m["a"]++;
m["b"] = 5;
// 遍历map
for (auto &[k, v] : m) {
cout << k << ": " << v << endl;
}
总结对比
容器 | 底层实现 | 时间复杂度 | 有序性 | 适用场景 |
---|---|---|---|---|
queue | 链表/数组 | O(1)插入删除 | 无 | BFS, FIFO场景 |
priority_queue | 堆 | O(logn)插入删除 | 部分 | 需要快速获取最大/最小元素 |
stack | 链表/数组 | O(1)插入删除 | 无 | DFS, LIFO场景 |
set | 红黑树 | O(logn)查找插入删除 | 有序 | 需要有序且不重复元素的集合 |
map | 红黑树 | O(logn)查找插入删除 | 有序 | 需要有序键值对 |