5.3 QSet 与 QMultiMap 的功能详解、应用示例与比较
Qt 中的 QSet
和 QMultiMap
是两种常用的容器类,不同乎于键值对容器,这两种类在数据类型和实现方式上有明显区别。以下将对其功能、应用场景和性能进行详细讨论。
一、QSet 与 QMultiMap 的概述
QSet 的概述
QSet
是一种无序集合容器,用于儲存唯一的元素,且不认顾元素的顺序。其内部基于哈希表实现。
特点:
-
元素唯一,将重复元素自动去重。
-
操作是对元素而非键值的操作。
-
提供集合操作,如并集和交集。
-
查找和插入操作的均值处理时间复杂度为 (O(1)),最均情况下为 (O(n))。
QMultiMap 的概述
QMultiMap
是一种允许重复键值的有序键值对容器,使用带有重复键值支持的平衡二叉树实现。
特点:
-
支持重复键值,不会自动去重。
-
按键值的顺序存储数据,适合需要有序访问的场景。
-
查找和操作时间复杂度为 (O(\log n))。
二、举例说明
QSet 示例
#include <QSet>
#include <QString>
#include <QDebug>
void QSetExample() {
QSet<QString> set;
// 插入元素
set.insert("Apple");
set.insert("Banana");
set.insert("Apple"); // 重复元素将自动去重
// 查询元素
if (set.contains("Apple")) {
qDebug() << "Set contains Apple.";
}
// 进行集合操作
QSet<QString> anotherSet;
anotherSet.insert("Banana");
anotherSet.insert("Cherry");
QSet<QString> unionSet = set.united(anotherSet); // 并集
for (const QString &item : unionSet) {
qDebug() << item;
}
}
QMultiMap 示例
#include <QMultiMap>
#include <QString>
#include <QDebug>
void QMultiMapExample() {
QMultiMap<QString, int> multiMap;
// 插入元素
multiMap.insert("Alice", 25);
multiMap.insert("Bob", 30);
multiMap.insert("Alice", 28); // 支持重复键值
// 查找元素
QList<int> values = multiMap.values("Alice");
for (int value : values) {
qDebug() << "Alice:" << value;
}
// 删除元素
multiMap.remove("Bob");
}
三、举例比较
特性 | QSet | QMultiMap |
---|---|---|
数据类型 | 元素集合,唯一元素 | 键值对,支持重复键值 |
数据存储顺序 | 无序 | 按键顺序存储 |
底层实现 | 哈希表 | 平衡二叉树 |
重复元素 | 不允许重复 | 允许重复 |
查找复杂度 | (O(1)) ,最均 (O(n)) | (O(\log n)) |
适用场景 | 非序存储,需要去重操作 | 需要重复键值和有序操作 |
四、选择 QSet 还是 QMultiMap?
使用 QSet 的场景
-
需要唯一元素和去重功能。
-
不关心元素的顺序,而是带有高性能操作。
-
例如:数据去重,集合计算。
使用 QMultiMap 的场景
-
需要允许重复键值,例如对同一键存储多个值。
-
存储数据需要按键顺序。
-
例如:数据分组,跟踪复数值应用。
总结
QSet
和 QMultiMap
是 Qt 中两类完全不同作用的容器。
-
如果需要集合操作和高性能查找,选择
QSet
。 -
如果需要允许重复键值,并且键顺序存储,选择
QMultiMap
。
根据实际场景,适宜地选择容器类,可以显著提升代码性能和维护性。