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 的项会相邻存储
正确选择容器类型可以提高代码效率和可读性。
浙公网安备 33010602011771号