QT基础教程(QMap和QHash)

文章目录

  • 前言
  • 一、QMap
  • 二、QHash
    • 三、QMap和QHash实际运用
  • 总结


前言

本篇文章将为大家讲解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当您需要快速查找、插入和删除键值对,并不关心元素的顺序。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/81350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cherry-pick

要将dev分支的某次提交给master分支&#xff0c;可以使用以下命令&#xff1a; 1. 切换到dev分支&#xff1a;git checkout dev 2. 查看提交历史&#xff0c;找到要提交给master的某次提交的commit hash&#xff08;假设为 <commit_hash>&#xff09; 3. 切换到master…

前端加密和解密

Base64加密&#xff1a; 加密&#xff1a;Base64.encode(); Base64.encode(); 解密&#xff1a;Base64.decode(); Base64.decode(); url携带参数加密&#xff1a; 加密&#xff1a;encodeURLComponent(); encodeURLComponent(); 解密&#xff1a;decodeURLComponent(); …

[软考中级]软件设计师-知识产权

考查 有2-3题&#xff0c;题号可能在10和12 著作权 也称为版权&#xff0c;只作者对其创作的作品享有的人身权和财产权 人身权包括发表权&#xff0c;署名权&#xff0c;修改权和保护作品完整权&#xff0c;其他权利均为财产权 我国发表权保护期为作者终生及其死亡后的50年…

HttpUtils带连接池

准备祖传了&#xff0c;有问题欢迎大家指正。 HttpUtil import com.txlc.cloud.commons.exception.ServiceException; import com.txlc.dwh.common.constants.MyErrorCode; import org.ssssssss.script.annotation.Comment;import java.io.UnsupportedEncodingException; impo…

JAVA入坑之嵌套类

一、嵌套类入门 1.1概述 Java嵌套类是指在一个类中定义另一个类的一种方式&#xff0c;它可以提高代码的可读性、可维护性和封装性。Java嵌套类分为两种类型&#xff1a;静态嵌套类和非静态嵌套类。 静态嵌套类&#xff1a;Static nested classes,即类前面有static修饰符 非静…

【论文解读】Faster sorting algorithm

一、简要介绍 基本的算法&#xff0c;如排序或哈希&#xff0c;在任何一天都被使用数万亿次。随着对计算需求的增长&#xff0c;这些算法的性能变得至关重要。尽管在过去的2年中已经取得了显著的进展&#xff0c;但进一步改进这些现有的算法路线的有效性对人类科学家和计算方法…

Prometheus PromQL数据查询语言

PromQL 简介 PromQL&#xff08;Prometheus Query Language&#xff09;是 Prometheus 内置的数据查询语言。支持用户进行实时的数据查询及聚合操作。 Prometheus 基于指标名称&#xff08;metrics name&#xff09;以及附属的标签集&#xff08;labelset&#xff09;唯一定义一…

2023-09-17 LeetCode每日一题(打家劫舍 II)

2023-09-17每日一题 一、题目编号 213. 打家劫舍 II二、题目链接 点击跳转到题目位置 三、题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房…

《golang设计模式》第二部分·结构型模式-05-门面模式Facade)

文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.2 类图 1. 概述 门面&#xff08;Facade&#xff09;向客户端提供使用子系统的统一接口&#xff0c;用于简化客户端使用子系统的操作。 1.1 角色 门面角色&#xff08;Facade&#xff09; 客户端可以调用的接…

svg图片代码data:image/svg+xml转png图片方法

把代码保存为html格式的文件中,用浏览器访问,即可右键保存 从AI软件或其它网站得到svg图片代码后,把他复制到下面源码上 注意:src""图片地址中,一些参数的含义 d‘这里是图片代码数据’ viewBox是图片显示区域,宽,高等 fill%23000000’这里表示颜色 ,后面6位0表示黑色…

Vercel.json配置路由重定向(重写)【vue项目】

在项目根目录创建vercel.json {"rewrites": [{"source": "/(.*)","destination": "/"}] } vue-router 路由模式改为 history&#xff08;vue2版本&#xff09; createWebHistory&#xff08;vue3版本&#xff09;

7、DVWA——SQL盲注

文章目录 一、概述二、low2.1 通关思路&#xff08;布尔盲注&#xff09;&#xff08;1&#xff09;判断是否存在SQL注入漏洞&#xff08;2&#xff09;判断属于数字型注入还是字符型注入&#xff08;3&#xff09;判断结果集中的字段数&#xff08;4&#xff09;猜数据库名长度…

ArcGIS Pro将SHP文件转CAD并保留图层名称

相信大家应该都使用过ArcGIS将SHP文件转CAD格式&#xff0c;转换过后所有的要素都在一个图层内&#xff0c;那么有没有办法将SHP文件某个字段的值作为CAD的图层名字呢&#xff0c;答案是肯定的&#xff0c;这里就为大家介绍一下ArcGIS Pro转CAD文件并且保留图层名称的方法&…

Windows编程dll基本知识点

前言 本篇博客主要是记录windows系统下dll开发的相关基本知识点&#xff0c;并使用相关分析工具分析&#xff0c;有利于初学者学习&#xff0c;更是为开发者查缺补漏&#xff1b; 使用dumpbin查看dll,lib,exe相关信息 VS编译器提供了查看链接库相关的工具&#xff0c;安装后…

【c++GDAL】IHS融合

【c&GDAL】IHS融合 基于IHS变换融合&#xff0c;实现多光谱和全色影像之间的融合。IHS分别指亮度(I)、色度(H)、饱和度(S)。IHS变换融合基于亮度I进行变换&#xff0c;色度和饱和度空间保持不变。 IHS融合步骤&#xff1a; &#xff08;1&#xff09;将多光谱RGB影像变换到…

网络安全:保护你的系统

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

FLASK中的鉴权的插件Flask-HTTPAuth

在 Web 应用中&#xff0c;我们经常需要保护我们的 api&#xff0c;以避免非法访问。比如&#xff0c;只允许登录成功的用户发表评论等。Flask-HTTPAuth 扩展可以很好地对 HTTP 的请求进行认证&#xff0c;不依赖于 Cookie 和 Session。本文主要介绍两种认证的方式&#xff1a;…

地牢大师问题(bfs提高训练 + 免去边界处理的特殊方法)

地牢大师问题 文章目录 地牢大师问题前言题目描述题目分析输入处理移动方式【和二维的对比】边界判断问题的解决 代码总结 前言 在之前的博客里面&#xff0c;我们介绍了bfs 基础算法的模版和应用,这里我们再挑战一下自己&#xff0c;尝试一个更高水平的题目&#xff0c;加深一…

点云从入门到精通技术详解100篇-基于点云语义分割的电力线提取及聚类研究(下)

目录 3.4.3 MSIDA-Net 与主成分分析法对比 基于簇最低点聚类算法的电力线聚类及重建

Docker部署单点Elasticsearch与Kibana

一 、 创建网络 因为需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里创建一个网络&#xff1a; docker network create es-net # 创建一个网络名称为:es-net 二 、拉取并加载镜像 方式一 docker pull elasticsearch:7.12.1 版本为elasticsearch的7…