QMap 的key可以重复吗
在 Qt 中,QMap
的 key 是不可以重复的。这是 QMap
的一个基本特性:
核心特性
-
唯一键 (Unique Keys):
-
QMap
中的每个 key 必须是唯一的 -
如果插入相同的 key,新值会覆盖旧值
-
-
排序存储:
-
Key 按照升序自动排序
-
基于红黑树实现,查找效率 O(log n)
-
示例代码
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 特性
-
允许重复键
-
相同 key 的值按插入顺序存储
-
提供便捷方法查找相同 key 的所有值
QMultiMap<QString, int> multiMap;
multiMap.insert("fruit", 10);
multiMap.insert("fruit", 20); // 允许重复
// 获取 "fruit" 的所有值
QList<int> values = multiMap.values("fruit");
// values = [10, 20]
对比表
特性 | QMap | QMultiMap |
---|---|---|
Key 是否唯一 | 是 | 否 |
插入相同 key 的行为 | 覆盖旧值 | 保留所有值 |
查找效率 | O(log n) | O(log n) |
排序 | Key 升序 | Key 升序 |
典型用途 | 字典/配置存储 | 一对多关系存储 |
如何选择?
-
需要 key 唯一 → 使用
QMap
-
需要 key 重复 → 使用
QMultiMap
-
只需要快速查找不关心顺序 → 考虑
QHash
/QMultiHash
(平均 O(1) 查找)
注意事项
-
QMultiMap
不是QMap
的子类,但 API 高度相似 -
使用
QMap::contains()
检查 key 是否存在 -
遍历
QMultiMap
时,相同 key 的项会相邻存储
正确选择容器类型可以提高代码效率和可读性。