QMultiMap&QHash&QList使用区别

发布于:2025-06-12 ⋅ 阅读:(33) ⋅ 点赞:(0)

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*>


网站公告

今日签到

点亮在社区的每一天
去签到