std::multimap允许重复键而std::map不允许;前者insert总成功并返回iterator,后者insert返回pair表示是否插入成功;两者均基于红黑树,时间复杂度O(log n),遍历重复键须用equal_range而非find。

std::multimap 允许重复键,std::map 不允许
这是最根本的区别:std::map 要求每个 key 唯一,插入重复键时会忽略新元素或返回失败;而 std::multimap 明确设计为支持多个相同 key 的 value,所有插入都会成功(除非内存不足)。
常见错误现象:用 map[key] = value 尝试“追加”多个值,结果只有最后一个生效——因为 operator[] 在 map 中会先默认构造一个值,再赋值,且不支持重复键。
-
std::map的insert()返回std::pair,bool表示是否插入成功 -
std::multimap的insert()总返回iterator,不带成功标志 - 两者都保持按键有序,底层都是红黑树,时间复杂度一致(O(log n) 插入/查找)
遍历相同键的所有元素要用 equal_range,不是 find
find() 在 multimap 中只返回一个匹配迭代器(任意一个,不保证是第一个),无法获取全部。必须用 equal_range(key) 获取一对迭代器,表示该键对应的所有元素的左闭右开区间。
使用场景:比如记录日志按时间戳(int)分组,同一秒内多条日志,需要批量读取。
立即学习“C++免费学习笔记(深入)”;
std::multimaplogs; logs.insert({1690000000, "login"}); logs.insert({1690000000, "fetch_data"}); logs.insert({1690000001, "logout"}); auto range = logs.equal_range(1690000000); for (auto it = range.first; it != range.second; ++it) { std::cout << it->second << "\n"; // 输出 login 和 fetch_data }
erase(key) 在 multimap 中删除全部匹配项,map 中只删一个(但 map 本来就没重复)
注意:std::map::erase(key) 删除的是键等于 key 的唯一节点;std::multimap::erase(key) 删除的是所有键等于 key 的节点。这个行为差异容易被忽略,尤其在写通用模板代码时。
- 若只想删
multimap中某一个匹配项,必须传入迭代器:erase(iterator) -
erase(iterator)在两者中行为一致:只删该位置元素 -
erase(first, last)也一致:删区间内所有元素
性能与内存:multimap 略高开销,但通常可忽略
两者底层结构完全相同,只是 multimap 放宽了键唯一性约束。实际内存占用几乎无差别,插入/查找/删除的常数因子略高(因需处理等价键的边界比较),但对绝大多数应用没有可观测影响。
真正要注意的是语义误用:把 multimap 当成“自动去重的容器”用,或在本应要求键唯一的业务逻辑里误用 multimap,会导致后续逻辑出错——比如用 at(key)(map 有,multimap 没有)时编译失败,或者遍历时漏掉部分数据。










