STL 中的 set 与 map
set 处理"集合 / 去重 / 排序",map 处理"键值对 / 计数"。
一、互动演示:set 自动去重 + 自动排序
往 set 里插数。重复的会被忽略,留下的永远是去重 + 升序的。
往 set 里 insert 几个数(试试插重复的)。
二、set 与 map 对比
| set | map | |
|---|---|---|
| 存什么 | 单个值(唯一) | 键值对 key→value(键唯一) |
| 顺序 | 按值升序 | 按键升序 |
| 典型用途 | 去重、判存在 | 计数、查表 |
| 底层 / 复杂度 | 红黑树,插入/删除/查找 O(log N) | |
三、参考代码:set 去重 + map 计数
#include <set>
#include <map>
using namespace std;
// ① set:输入若干数,去重 + 升序输出
set<int> s;
int x;
while (cin >> x) s.insert(x); // 重复自动忽略
for (int v : s) cout << v << " ";
// ② map:统计每个单词出现次数
map<string, int> cnt;
string w;
while (cin >> w) cnt[w]++; // 不存在则自动建为 0 再 +1
for (auto& kv : cnt)
cout << kv.first << " " << kv.second << "\n";
神技:cnt[key]++ —— key 不存在会自动新建并初始化为 0,是计数的最常用写法。