STL常用容器

STL常用容器

queue (队列)

queue <int> q

常见应用场景

  • BFS (广度优先搜索)

  • 模拟排队过程

  • 滑动窗口问题

对应的函数方法

  • push(x) - 在队尾插入元素x
  • pop() - 删除队首元素
  • 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) - 插入元素x
  • pop() - 删除顶部元素
  • 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) - 压入元素x
  • pop() - 弹出顶部元素
  • top() - 返回顶部元素
  • empty() - 判断是否为空
  • size() - 返回元素个数

应用举例

P1449 后缀表达式 - 洛谷

// 括号匹配
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_queueO(logn)插入删除部分需要快速获取最大/最小元素
stack链表/数组O(1)插入删除DFS, LIFO场景
set红黑树O(logn)查找插入删除有序需要有序且不重复元素的集合
map红黑树O(logn)查找插入删除有序需要有序键值对

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值