当前位置: 首页 > article >正文

QT开发:深入详解 Qt 核心类:QMap的基本概念和使用方法

目录

1. 基本概念

2. QMap 的特性

3. 基本使用方法

3.1 创建和初始化 QMap

3.2 添加和访问元素

3.3 查找和删除元素

3.4 遍历 QMap

4. 深入功能

4.1 QMap 的键排序

4.2 QMap 的多键支持

4.3 查找所有值

. 性能考虑

6. 总结

参考文档


1. 基本概念

QMap 是 Qt 框架中的一个重要容器类,用于存储键值对(key-value pair)。它类似于 C++ 标准库中的 std::map,提供了快速的键值查找、插入和删除操作。QMap 使用平衡二叉树(通常是红黑树)作为其底层数据结构,这意味着所有的操作都在 O(log n) 时间复杂度内完成。

QMap 允许存储任意类型的键和值,并且键的类型必须支持 < 运算符,用于键的排序和比较。

2. QMap 的特性

  • 键值对存储:每个元素包括一个键和一个对应的值。
  • 有序存储:内部使用平衡二叉树存储元素,键按升序排序。
  • 多键支持:同一个键可以存在多个不同的值,具体使用 QMultiMap 类。
  • 高效操作:查找、插入和删除操作时间复杂度为 O(log n)。

3. 基本使用方法

下面将通过一些示例代码详细介绍 QMap 的常见操作。

3.1 创建和初始化 QMap

创建 QMap 对象非常简单,只需指定键和值的类型即可:

#include <QMap>
#include <QString>
#include <QDebug>

int main() {
    // 创建一个存储 QString 键和 int 值的 QMap
    QMap<QString, int> map;

    // 初始化 QMap
    map["one"] = 1;
    map["two"] = 2;
    map["three"] = 3;

    // 输出初始映射表
    qDebug() << "Initial map:" << map;

    return 0;
}

3.2 添加和访问元素

QMap 提供了多种方法来添加和访问元素:

#include <QMap>
#include <QString>
#include <QDebug>

int main() {
    QMap<QString, int> map;

    // 添加元素到 QMap
    map.insert("one", 1);
    map.insert("two", 2);

    // 使用 [] 操作符添加元素
    map["three"] = 3;

    // 访问元素
    qDebug() << "Value for key 'one':" << map.value("one");
    qDebug() << "Value for key 'two':" << map["two"];

    // 修改元素
    map["two"] = 22;
    qDebug() << "Modified map:" << map;

    return 0;
}
3.3 查找和删除元素

QMap 支持多种查找和删除元素的方法:

#include <QMap>
#include <QString>
#include <QDebug>

int main() {
    QMap<QString, int> map;
    map["one"] = 1;
    map["two"] = 2;
    map["three"] = 3;

    // 查找元素
    if (map.contains("two")) {
        qDebug() << "Map contains key 'two' with value:" << map.value("two");
    }

    // 删除元素
    map.remove("two");
    qDebug() << "Map after removing key 'two':" << map;

    return 0;
}
3.4 遍历 QMap

有多种方法可以遍历 QMap 中的元素:

#include <QMap>
#include <QString>
#include <QDebug>

int main() {
    QMap<QString, int> map;
    map["one"] = 1;
    map["two"] = 2;
    map["three"] = 3;

    // 使用迭代器遍历 QMap
    qDebug() << "Using iterator:";
    QMap<QString, int>::const_iterator it = map.constBegin();
    while (it != map.constEnd()) {
        qDebug() << it.key() << ":" << it.value();
        ++it;
    }

    // 使用 range-based for 循环遍历
    qDebug() << "Using range-based for loop:";
    for (auto it = map.cbegin(); it != map.cend(); ++it) {
        qDebug() << it.key() << ":" << it.value();
    }

    return 0;
}

4. 深入功能

4.1 QMap 的键排序

QMap 会自动按照键的升序进行排序。如果需要自定义排序行为,可以重载键类型的 < 运算符。

#include <QMap>
#include <QString>
#include <QDebug>

struct CaseInsensitiveString {
    QString str;
    CaseInsensitiveString(const QString &s) : str(s) {}
    bool operator<(const CaseInsensitiveString &other) const {
        return str.toLower() < other.str.toLower();
    }
};

int main() {
    QMap<CaseInsensitiveString, int> map;
    map["one"] = 1;
    map["Two"] = 2;
    map["three"] = 3;

    // 遍历 QMap
    for (auto it = map.cbegin(); it != map.cend(); ++it) {
        qDebug() << it.key().str << ":" << it.value();
    }

    return 0;
}
4.2 QMap 的多键支持

如果需要一个键对应多个值,可以使用 QMultiMap 类:

#include <QMultiMap>
#include <QString>
#include <QDebug>

int main() {
    QMultiMap<QString, int> multiMap;
    multiMap.insert("one", 1);
    multiMap.insert("one", 11);
    multiMap.insert("two", 2);

    // 遍历 QMultiMap
    for (auto it = multiMap.cbegin(); it != multiMap.cend(); ++it) {
        qDebug() << it.key() << ":" << it.value();
    }

    return 0;
}
4.3 查找所有值

QMap 提供了 values() 方法来获取某个键对应的所有值:

#include <QMap>
#include <QString>
#include <QDebug>

int main() {
    QMap<QString, int> map;
    map.insert("one", 1);
    map.insert("two", 2);
    map.insert("one", 11);

    // 获取某键对应的所有值
    QList<int> values = map.values("one");
    qDebug() << "Values for key 'one':" << values;

    return 0;
}

. 性能考虑

QMap 在以下几个方面具有较好的性能表现:

  • 查找:通过平衡二叉树实现,查找操作的时间复杂度为 O(log n)。
  • 插入和删除:插入和删除操作的时间复杂度为 O(log n)。
  • 内存使用QMap 通过平衡二叉树存储数据,相较于哈希表占用的内存会略高。

6. 总结

  QMap 是 Qt 框架中的一个重要类,提供了功能丰富且高效的键值对存储。通过 QMap,开发者可以轻松地管理和操作有序的键值对数据。本文详细介绍了 QMap 的基本概念、常用方法以及一些高级功能,希望能够帮助读者更好地理解和使用 QMap

参考文档

  • Qt 官方文档:QMap 类
  • Qt 官方文档:QtCore 模块

通过理解和掌握 QMap 的使用方法,开发者可以更加高效地进行 Qt 程序开发,提高代码的可读性和维护性。


http://www.kler.cn/news/325361.html

相关文章:

  • Android RecyclerView 实现 GridView ,并实现点击效果及方向位置的显示
  • 【测试】——JUnit
  • 全网最全软件测试面试题(含答案解析+文档)
  • Unity 新NavMesh演示(1)
  • 如何在 Ubuntu 22.04 上使用 Browserless?
  • CAD快捷键
  • CMMI认证的好处
  • 在Vue.js中,你可以使用Element UI的el-input组件结合计算属性来实现模糊查询
  • list模拟实现(部分)
  • 统一建模语言(UML)在软件研发过程中常用图接受:类图、用例图、时序图、状态图、活动图、流程图、顺序图
  • 【在Linux世界中追寻伟大的One Piece】命名管道
  • 探索词向量的奥秘:自然语言处理的基石
  • 【SOP】Windows下安装Neo4j流程
  • 头歌 应用密码学实验(1-3实验代码)
  • iOS 项目中的多主题颜色设计与实现
  • python股票因子,交易所服务器宕机,量化交易程序怎么应对
  • docker和ufw冲突问题
  • 【黑马软件测试一、二】软件测试基础与Linux、数据库
  • CFR( Java 反编译器)---> lambda 表达式底层实现机制
  • 【计算机网络】网络层详解
  • 解决Pymysql has no attribute ‘escape_string‘ 并且无法引入该模块
  • 爱速搭百度低代码开发平台
  • 视频汇聚EasyCVR视频监控平台调取接口提示“认证过期”是什么原因?
  • 通信工程师笔记
  • 生成对抗网络(Generative Adversarial Networks, GANs)
  • Pymsql 插入数据时报错 Unkown column xxxx in field list
  • 昇思MindSpore进阶教程--轻量化数据处理
  • 【HTTPS】中间人攻击和证书的验证
  • 手写SpringMVC
  • Subdominator:一款针对漏洞奖励计划的子域名安全枚举工具