QMap 的key可以重复吗

 

在 Qt 中,QMap 的 key 是不可以重复的。这是 QMap 的一个基本特性:

核心特性

  1. 唯一键 (Unique Keys)

    • QMap 中的每个 key 必须是唯一的

    • 如果插入相同的 key,新值会覆盖旧值

  2. 排序存储

    • Key 按照升序自动排序

    • 基于红黑树实现,查找效率 O(log n)

示例代码

cpp
复制
QMap<QString, int> map;
map.insert("apple", 10);
map.insert("banana", 20);
map.insert("apple", 30);  // 会覆盖之前的 "apple"

qDebug() << map; 
// 输出: QMap(("apple", 30), ("banana", 20))

如果需要 key 重复怎么办?

Qt 提供了 QMultiMap 来处理需要重复 key 的情况:

QMultiMap 特性

  1. 允许重复键

  2. 相同 key 的值按插入顺序存储

  3. 提供便捷方法查找相同 key 的所有值

cpp
复制
QMultiMap<QString, int> multiMap;
multiMap.insert("fruit", 10);
multiMap.insert("fruit", 20);  // 允许重复

// 获取 "fruit" 的所有值
QList<int> values = multiMap.values("fruit");
// values = [10, 20]

对比表

特性QMapQMultiMap
Key 是否唯一
插入相同 key 的行为 覆盖旧值 保留所有值
查找效率 O(log n) O(log n)
排序 Key 升序 Key 升序
典型用途 字典/配置存储 一对多关系存储

如何选择?

  • 需要 key 唯一 → 使用 QMap

  • 需要 key 重复 → 使用 QMultiMap

  • 只需要快速查找不关心顺序 → 考虑 QHash/QMultiHash(平均 O(1) 查找)

注意事项

  1. QMultiMap 不是 QMap 的子类,但 API 高度相似

  2. 使用 QMap::contains() 检查 key 是否存在

  3. 遍历 QMultiMap 时,相同 key 的项会相邻存储

正确选择容器类型可以提高代码效率和可读性。

posted @ 2025-04-10 10:13  远方是什么样子  阅读(126)  评论(0)    收藏  举报