std::set存储单一去重排序的键,仅支持按值查找;std::map存储键值对,键去重排序,仅支持按键查找。二者均基于红黑树,操作复杂度O(log n),迭代器双向。

std::set 存的是单一值,自动去重并排序;std::map 存的是“键-值对”,用键查值,键自动去重并排序,值可重复。
核心区别:存什么?怎么查?
set 是“只存 key”的容器,比如你只想维护一组不重复的整数:{2, 5, 1, 8},插入后自动变成 {1, 2, 5, 8},不能通过下标访问,只能用迭代器遍历或 find 查某个值是否存在。
map 则是“key → value”的映射,比如用学号(int)查姓名(string):{ {1001,"张三"}, {1002,"李四"} }。你只能用 key 查 value(如 m[1001] 或 m.find(1001)),不能用 value 反查 key。
底层实现和性能完全一致
两者默认都基于红黑树实现,所以:
• 插入、删除、查找都是 O(log n)
• 元素按 key 严格升序排列(自定义比较器可改)
• 迭代器是双向的,不支持随机访问
• 内存开销略大于 vector,但远小于哈希容器
什么时候选 set,什么时候选 map?
- 只需要记录“有没有这个元素”,比如去重统计用户 ID、维护已访问节点集合 → 用 set
- 需要根据一个标识快速拿到对应数据,比如配置项名查配置值、IP 地址查连接状态 → 用 map
- 想用字符串当索引,又不想写数组下标转换逻辑 → map
比 vector + find 更直观 - 要存多个相同值,但又需要按某种规则排序 → set 不行(会去重),考虑 multiset 或 vector + sort
别忘了还有 unordered 版本
如果不需要排序,只追求平均 O(1) 查找,且 key 可哈希(如 int、string),优先考虑:
• unordered_set 替代 set
• unordered_map 替代 map
注意:它们不保证顺序,遍历时顺序不确定,且哈希冲突可能退化性能。
立即学习“C++免费学习笔记(深入)”;
基本上就这些。选对容器不靠死记,看清楚“我要存什么”“我怎么访问它”“要不要顺序”三个问题,答案自然就出来了。










