QMultiMapQHashQList使用区别
QMultiMap&QHash&QList使用区别
场景:如何在一个集合中存储所有打开的 UI,并高效判断是否存在标题为 “abc” 的窗口?
✅ 1. 使用 QList<QWidget*>
示例代码:
QList<QWidget*> uiList;// 判断是否存在 title == "abc" 的窗口
bool found = std::any_of(uiList.begin(), uiList.end(), [](QWidget* w) {return w && w->windowTitle() == "abc";
});
✅ 优点:
简单直接。
支持重复窗口。
遍历方便。
❌ 缺点:
查找是线性复杂度 O(n),窗口多时性能下降。
不支持通过标题快速定位窗口。
✅ 适用场景:
窗口不多时使用最合适。
有可能存在多个标题相同的窗口。
✅ 2. 使用 QMap<QString, QWidget*> (key 是标题)
示例代码:
QMap<QString, QWidget*> uiMap;
uiMap.insert("abc", someWindow);// 判断是否存在标题为 "abc"
bool found = uiMap.contains("abc");
✅ 优点:
查找复杂度为 O(log n)。
可直接通过标题定位窗口。
❌ 缺点:
标题不能重复,否则会覆盖。
不适合多个窗口标题相同的情况。
✅ 适用场景:
每个窗口标题唯一(如管理不同模块窗口)。
✅ 3. 使用 QMultiMap<QString, QWidget*>(支持多个同名窗口)
示例代码:
QMultiMap<QString, QWidget*> uiMultiMap;
uiMultiMap.insert("abc", w1);
uiMultiMap.insert("abc", w2); // 支持同名// 判断是否有 "abc" 标题窗口
bool found = uiMultiMap.contains("abc");
✅ 优点:
支持同名窗口。
依然可通过 key 快速查找。
❌ 缺点:
取出所有相同 key 的窗口需 values(“abc”)。
写法比 QList 稍复杂。
✅ 适用场景:
有多个同名窗口,但需要分类管理。
✅ 4. 使用 QHash<QString, QWidget*>
同 QMap,只是底层用哈希,查找是 O(1)。
示例代码:
QHash<QString, QWidget*> uiHash;
uiHash.insert("abc", someWindow);
bool found = uiHash.contains("abc");
✅ 优点:
查找是常数时间,性能最优。
❌ 缺点:
同样不能重复 key。
容器类型 | 是否支持重复标题 | 查找性能 | 适用场景描述 |
---|---|---|---|
QList<QWidget*> | ✅ 支持 | ❌ O(n) | 最通用,窗口少时简单方便 |
QMap<QString, QWidget*> | ❌ 不支持 | ✅ O(log n) | 窗口标题唯一 |
QMultiMap<QString, QWidget*> | ✅ 支持 | ✅ O(log n) | 有多个同名窗口时 |
QHash<QString, QWidget*> | ❌ 不支持 | ✅ O(1) | 标题唯一 + 性能敏感场景 |
✨ 建议选择:
✅ 少量窗口 + 简单需求 → 用 QList<QWidget*>
✅ 需要快速查找且标题唯一 → 用 QHash<QString, QWidget*>
✅ 同名窗口 + 分类管理 → 用 QMultiMap<QString, QWidget*>