STL容器在算法竞赛中的常见应用及方法总结STL:queue、priority_queue、set、stack、map、unordered_map、unordered_set

STL容器在算法竞赛中的常见应用及方法总结

queue (队列)

常见应用场景

  • BFS (广度优先搜索)
  • 模拟排队过程
  • 滑动窗口问题

对应的函数方法

  • push(x) - 在队尾插入元素x
  • pop() - 删除队首元素
  • front() - 返回队首元素
  • back() - 返回队尾元素
  • empty() - 判断队列是否为空
  • size() - 返回队列中元素个数

应用举例

// BFS模板
queue<int> q;
q.push(start);
while (!q.empty()) {
    int current = q.front();
    q.pop();
    // 处理current节点
    for (auto neighbor : get_neighbors(current)) {
        if (!visited[neighbor]) {
            visited[neighbor] = true;
            q.push(neighbor);
        }
    }
}

priority_queue (优先队列)

常见应用场景

  • Dijkstra算法
  • 哈夫曼编码
  • 需要动态获取最大值/最小值的场景

对应的函数方法

  • push(x) - 插入元素x
  • pop() - 删除顶部元素
  • top() - 返回顶部元素(最大或最小)
  • empty() - 判断是否为空
  • size() - 返回元素个数

应用举例

// 默认是大顶堆
priority_queue<int> max_heap;

// 小顶堆定义方式
priority_queue<int, vector<int>, greater<int>> min_heap;

// Dijkstra算法中的使用
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push({0, start});
while (!pq.empty()) {
    auto [dist, u] = pq.top();
    pq.pop();
    if (dist > distance[u]) continue;
    // 松弛操作...
}

stack (栈)

常见应用场景

  • DFS (深度优先搜索)
  • 表达式求值
  • 括号匹配
  • 单调栈问题

对应的函数方法

  • push(x) - 压入元素x
  • pop() - 弹出顶部元素
  • 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();
    }
}
return s.empty();

set (集合)

常见应用场景

  • 维护有序不重复元素
  • 需要频繁查找/插入/删除的场景
  • 需要前驱/后继操作的场景

对应的函数方法

  • 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
if (it != s.begin()) {
    auto prev_it = prev(it); // 指向前驱1
}

map (映射)

常见应用场景

  • 键值对存储
  • 需要按键排序的场景
  • 频率统计

对应的函数方法

  • 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() - 迭代器
  • operator[] - 访问或插入元素

应用举例

map<string, int> word_count;
word_count["apple"]++;
word_count["banana"] = 5;

// 遍历map
for (auto &[word, count] : word_count) {
    cout << word << ": " << count << endl;
}

unordered_map (无序映射)

常见应用场景

  • 需要快速查找的键值对存储
  • 不关心键的顺序
  • 频率统计(比map更快)

对应的函数方法

  • insert({key, value}) - 插入键值对
  • erase(key) - 删除键为key的元素
  • find(key) - 查找键为key的元素
  • count(key) - 返回键是否存在(0或1)
  • empty() - 判断是否为空
  • size() - 返回元素个数
  • begin()/end() - 迭代器
  • operator[] - 访问或插入元素

应用举例

unordered_map<int, int> freq;
for (int num : nums) {
    freq[num]++;
}

// 查找元素
if (freq.find(42) != freq.end()) {
    cout << "42 appears " << freq[42] << " times" << endl;
}

unordered_set (无序集合)

常见应用场景

  • 快速查找元素是否存在
  • 去重操作
  • 不关心元素顺序的集合操作

对应的函数方法

  • insert(x) - 插入元素x
  • erase(x) - 删除元素x
  • find(x) - 查找元素x,返回迭代器
  • count(x) - 返回x是否存在(0或1)
  • empty() - 判断是否为空
  • size() - 返回元素个数
  • begin()/end() - 迭代器

应用举例

unordered_set<int> seen;
for (int num : nums) {
    if (seen.count(target - num)) {
        return {num, target - num};
    }
    seen.insert(num);
}

总结对比

容器底层实现时间复杂度有序性适用场景
queue链表/数组O(1)插入删除BFS, FIFO场景
priority_queueO(logn)插入删除部分需要快速获取最大/最小元素
stack链表/数组O(1)插入删除DFS, LIFO场景
set红黑树O(logn)查找插入删除有序需要有序且不重复元素的集合
map红黑树O(logn)查找插入删除有序需要有序键值对
unordered_set哈希表平均O(1)查找插入删除无序需要快速查找且不关心顺序
unordered_map哈希表平均O(1)查找插入删除无序需要快速键值查找且不关心顺序

在算法竞赛中,根据具体需求选择合适的容器可以显著提高代码效率和编写速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hongjianMa

感恩社区,回馈社区

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值