5.3 QSet 与 QMultiMap 的功能详解、应用示例与比较

5.3 QSet 与 QMultiMap 的功能详解、应用示例与比较

Qt 中的 QSetQMultiMap 是两种常用的容器类,不同乎于键值对容器,这两种类在数据类型和实现方式上有明显区别。以下将对其功能、应用场景和性能进行详细讨论。


一、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");
}

三、举例比较

特性QSetQMultiMap
数据类型元素集合,唯一元素键值对,支持重复键值
数据存储顺序无序按键顺序存储
底层实现哈希表平衡二叉树
重复元素不允许重复允许重复
查找复杂度(O(1)) ,最均 (O(n))(O(\log n))
适用场景非序存储,需要去重操作需要重复键值和有序操作

四、选择 QSet 还是 QMultiMap?

使用 QSet 的场景
  • 需要唯一元素和去重功能。

  • 不关心元素的顺序,而是带有高性能操作。

  • 例如:数据去重,集合计算。

使用 QMultiMap 的场景
  • 需要允许重复键值,例如对同一键存储多个值。

  • 存储数据需要按键顺序。

  • 例如:数据分组,跟踪复数值应用。


总结

QSetQMultiMap 是 Qt 中两类完全不同作用的容器。

  • 如果需要集合操作和高性能查找,选择 QSet

  • 如果需要允许重复键值,并且键顺序存储,选择 QMultiMap

根据实际场景,适宜地选择容器类,可以显著提升代码性能和维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值