首页 > 其他分享 >QT基础教程(QMap和QHash)

QT基础教程(QMap和QHash)

时间:2023-10-13 23:09:25浏览次数:38  
标签:QHash QT 哈希 查找 键值 基础教程 include QMap

(文章目录)


前言

本篇文章将为大家讲解QT中两个非常重要的类:QMap和QHash。

QMap和QHash都是Qt框架中用于存储键值对的数据结构,它们提供了快速的查找、插入和删除操作,但在某些方面有一些不同之处。

一、QMap

QMap是一个有序的键值对容器,它根据键的顺序来存储元素。当您需要按照键的顺序迭代或根据键进行范围查找时,QMap是一个不错的选择。

#include <QMap>

QMap<int, QString> map;

// 插入键值对
map.insert(1, "Alice");
map.insert(2, "Bob");
map[3] = "Charlie"; // 使用下标操作符插入或更新

// 查找元素
QString value = map.value(2); // 获取键2对应的值
if (map.contains(3)) {
    // 键3存在
}

// 遍历键值对
QMap<int, QString>::const_iterator it;
for (it = map.constBegin(); it != map.constEnd(); ++it) {
    int key = it.key();
    QString val = it.value();
    // 处理键值对
}

// 删除元素
map.remove(1);

二、QHash

QHash是一个无序的键值对容器,它使用哈希表来存储元素,因此查找速度通常比QMap更快。但请注意,它不保留元素的插入顺序。

#include <QHash>

QHash<QString, int> hash;

// 插入键值对
hash.insert("apple", 5);
hash.insert("banana", 3);
hash["cherry"] = 8;

// 查找元素
int value = hash.value("banana"); // 获取键"banana"对应的值
if (hash.contains("cherry")) {
    // 键"cherry"存在
}

// 遍历键值对
QHash<QString, int>::const_iterator it;
for (it = hash.constBegin(); it != hash.constEnd(); ++it) {
    QString key = it.key();
    int val = it.value();
    // 处理键值对
}

// 删除元素
hash.remove("apple");

三、QMap和QHash实际运用

QMap的实际运用:

1.数据存储和排序:QMap用于存储键值对,并根据键的顺序进行排序。这在需要按键排序的数据展示或报表生成中非常有用。

2.配置管理:您可以使用QMap来管理应用程序的配置参数,其中键是配置项的名称,值是配置项的值。

3.国际化和本地化:在多语言应用中,可以使用QMap来存储不同语言版本的文本翻译。键可以是原始文本,而值是翻译后的文本。

4.事件分发:在GUI应用程序中,您可以使用QMap来建立事件分发机制,其中键是事件类型,而值是事件处理程序。这样可以实现灵活的事件处理。

QHash的实际运用:

1.高速查找:QHash通常比QMap更快,因为它使用哈希表实现。因此,对于大型数据集的高速查找和索引,QHash是一个不错的选择。

2.缓存管理:在需要缓存大量数据以提高访问速度的应用中,QHash可以用作缓存的数据结构。键可以是缓存的标识符,而值是实际的缓存数据。

3.数据去重:如果您有一组数据,并且需要去除其中的重复元素,QHash可以用来检测和去重重复项。

4.关联数据:在某些情况下,需要将不同数据集之间的关联信息存储在一个地方,QHash可以用来建立这种关联,其中键表示一个数据集中的某个元素,而值表示与其相关的其他数据。

5.快速插入和删除:如果需要频繁地插入和删除元素,QHash的性能比QMap更高,因为哈希表的平均插入和删除复杂度是O(1)。

QMap的实际运用示例:

1.数据存储和排序:

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

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

    // 存储学生名字和分数
    studentScores.insert("Alice", 90);
    studentScores.insert("Bob", 85);
    studentScores.insert("Charlie", 92);

    // 遍历并打印学生名字和分数
    QMap<QString, int>::const_iterator it;
    for (it = studentScores.constBegin(); it != studentScores.constEnd(); ++it) {
        QString name = it.key();
        int score = it.value();
        qDebug() << name << ": " << score;
    }

    return 0;
}

2.配置管理:

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

int main() {
    QMap<QString, QVariant> appConfig;

    // 设置配置项
    appConfig.insert("language", "English");
    appConfig.insert("theme", "Dark");
    appConfig.insert("fontSize", 12);

    // 获取和修改配置项
    QString language = appConfig.value("language").toString();
    int fontSize = appConfig.value("fontSize").toInt();
    appConfig["fontSize"] = 14;

    // 打印配置项
    QMap<QString, QVariant>::const_iterator it;
    for (it = appConfig.constBegin(); it != appConfig.constEnd(); ++it) {
        QString key = it.key();
        QVariant value = it.value();
        qDebug() << key << ": " << value;
    }

    return 0;
}

QHash的实际运用示例:

1.缓存管理:

#include <QHash>
#include <QString>
#include <QByteArray>
#include <QDebug>

int main() {
    QHash<QString, QByteArray> imageCache;

    // 从磁盘加载图像并缓存
    QString imagePath = "path/to/image.jpg";
    QByteArray imageData = loadFromDisk(imagePath);
    imageCache.insert(imagePath, imageData);

    // 从缓存获取图像
    QByteArray cachedData = imageCache.value(imagePath);
    if (!cachedData.isNull()) {
        // 图像可用,进行处理
        processImage(cachedData);
    }

    return 0;
}

2.数据去重:

#include <QHash>
#include <QStringList>
#include <QDebug>

int main() {
    QStringList fruits = { "apple", "banana", "apple", "cherry", "banana" };

    QHash<QString, int> uniqueFruits;
    foreach(const QString& fruit, fruits) {
        uniqueFruits.insert(fruit, 0); // 使用哈希表去重
    }

    // 打印去重后的水果列表
    qDebug() << "Unique fruits:";
    foreach(const QString& fruit, uniqueFruits.keys()) {
        qDebug() << fruit;
    }

    return 0;
}

四、QMap和QHash的区别

1.排序:

QMap:QMap 是有序的关联容器,它会根据键的顺序自动进行排序。这意味着当你遍历 QMap 时,元素的顺序是按照键的大小升序排列的。 QHash:QHash 是无序的关联容器,它不会对元素进行排序。在 QHash 中,元素的顺序是不确定的。

2.查找性能:

QMap:由于 QMap 是有序的,所以在查找某个键时,它可以使用二分查找算法,因此查找操作的性能是对数级别的,即 O(log n)。 QHash:QHash 使用哈希表来存储键值对,因此查找操作通常具有常数时间复杂度,即 O(1)。在大多数情况下,QHash 的查找性能更高。

3.插入和删除性能:

QMap 和 QHash 在插入和删除操作上都有相似的性能,通常是 O(1) 级别的,因为它们都使用了哈希表作为底层数据结构。

4.哈希函数:

QMap 不依赖于哈希函数,而是使用键的比较操作来确定元素的顺序。 QHash 使用哈希函数来确定元素在哈希表中的位置。

5.内存占用:

由于 QMap 需要维护元素的排序,它通常比 QHash 占用更多的内存。 键的要求:

QHash 需要键类型提供哈希函数和相等性操作符(operator==),以确保正确的哈希和查找行为。 QMap 不需要键类型提供这些函数。

6.使用场景:

如果你需要根据键的顺序来访问元素,或者希望元素以特定的顺序存储,那么选择 QMap 更合适。

如果你主要关心查找性能,并且不需要元素的特定顺序,那么选择 QHash 更合适。

总结

使用QMap当您需要按顺序存储和访问键值对,或者需要使用自定义排序准则。 使用QHash当您需要快速查找、插入和删除键值对,并不关心元素的顺序。

本篇文章就讲解到这里,下篇文章继续讲解。

标签:QHash,QT,哈希,查找,键值,基础教程,include,QMap
From: https://blog.51cto.com/u_16153875/7851293

相关文章

  • ACS系列(5) ACS QT版C Demo Measurement
    1)工程文件QT=coreCONFIG+=c++17cmdline#YoucanmakeyourcodefailtocompileifitusesdeprecatedAPIs.#Inordertodoso,uncommentthefollowingline.#DEFINES+=QT_DISABLE_DEPRECATED_BEFORE=0x060000#disablesalltheAPIsdeprecatedbefor......
  • QT 界面隐藏标题栏后设置可支持拖动
    QT界面隐藏标题栏后设置可支持拖动,需要重写界面的mousePressEvent,mouseMoveEvent,mouseReleaseEvent事件,代码如下。1#include<QWidget>2#include<QMouseEvent>34classCustomWidget:publicQWidget{5Q_OBJECT67public:8explicitCustomWidg......
  • QT 给图片添加一层颜色遮罩
    最近公司需求,在一张带有透明度的图片上增加一层颜色遮罩,记录一下。1#include<QImage>2#include<QPainter>34intmain(){5//行数56//加载原始图像7QImageoriginalImage("path/to/your/image.png");89//行数910//创建......
  • 第三方IDE使用gdb调试Qt实现pretty print
      直接使用gdb调试Qt应用时,Qt的一些数据类型没法友好的显示出来,而qtcreator可以很好的展示出来,qtcreator也是通过gdb来调试的,在展示数据时,其实是gdb通过python脚本来处理后显示的,这些python脚本位于/usr/share/qtcreator/debugger这个位置(ubuntu20.04)。gdb在启动时,会自动在某......
  • QT基础教程(QPalette和QIcon)
    (文章目录)前言本篇文章继续讲解QT中的知识,主要为大家讲解QPalette和QIcon。QPalette和QIcon都是Qt框架中用于图形界面设计的类,它们分别用于管理调色板和图标的相关功能。一、QPalette类QPalette(调色板)QPalette类用于管理和控制Qt应用程序的颜色方案,它定义了各种图形界......
  • QT部件透明阴影效果和透明窗体
      透明效果1.设置整个窗体透明调用setWindowOpacity()方法,传入一个0~1之间的值来表示透明度;1表示不透明,0表示完全透明,在构造函数中添加setWindowOpacity(0.5);//0~1之间2.设置窗体透明,部件不透明在构造函数中添加//设置窗体透明this->setAttribute(Qt::WA_Transluc......
  • QT--QString的arg方法
    在QT的QString中,arg方法类似于C中的printf中使用的格式输出符(只是有点类似)。在QT5的帮助文档中,可以看出以下几点:使用arg(str1,str2,str3)这种方法进行替换。使用arg(str1).arg(str2).arg(str3)这种方法进行替换。​使用arg(int, int, int)这种方式进行替换。解释......
  • 关于vscode编写qt,qdebug无法输出到终端的问题
    这个问题主要是cmake那边的qt设置没弄好。其中WIN32_EXECUTABLEON。这个选项要设置为OFF。不然qdebug无法打印到终端中。如果本来就没有这set_target_properties的话,可以在cmake最后一行加上这个,并且将WIN32_EXECUTABLEON设置为OFF即可。set_target_properties(appl......
  • Qt信号槽与事件循环学习笔记
    事件与事件循环信号槽机制事件与事件循环在Qt中,事件(event)被封装为QEvent类/子类对象,用来表示应用内部或外部发生的各种事情。事件可以被任何QObject子类的对象接收并处理。根据事件的创建方式和调度方式,Qt中事件可分为三类,分别是:自发事件(Spontaneousevent)由窗口系统(windo......
  • 软件测试|Linux 基础教程:创建和删除目录
    简介在Linux系统中,创建和删除目录是非常常见的操作。目录是用于组织文件和其他目录的一种结构,它们是组织文件系统的重要组成部分。本文将介绍如何在Linux系统中创建和删除目录。创建目录在Linux中,可以使用mkdir命令来创建一个新的目录。mkdir是MakeDirectory(创建目......