Qt学习之路(37): Qt容器类之关联存储容器

Qt学习之路25--QMap和QHash 在C++标准库中是有map容器的概念。 QMap QMap是一个以升序键顺序存储键值对的数据结构 QMap原型为class QMap 阅读详情
今天我们来说说Qt容器类中的关联存储容器。所谓关联存储容器,就是容器中存储的一般是二元组,而不是单个的对象。二元组一般表述为<Key-Value>,也就是“键-值对”。
 
首先,我们看看数组的概念。数组可以看成是一种<int-Object>形式的键-值对,它的Key只能是int,而值的类型是Object,也就是任意类型(注意,这里我们只是说数组可以是任意类型,这个Object并不必须是一个对象)。现在我们扩展数组的概念,把Key也做成任意类型的,而不仅仅是int,这样就是一个关联容器了。如果学过数据结构,典型的关联容器就是散列(Hash Map,哈希表)。Qt提供两种关联容器类型:QMap<K, T>和QHash<K, T>。
 
QMap<K, T>是一种键-值对的数据结构,它实际上使用跳表skip-list实现,按照K进行升序的方式进行存储。使用QMap<K, T>的insert()函数可以向QMap<K, T>中插入数据,典型的代码如下:
 
QMap<QString,  int> map; 
map.insert( "eins", 1); 
map.insert( "sieben", 7); 
map.insert( "dreiundzwanzig", 23);
 
同样,QMap<K, T>也重载了[]运算符,你可以按照数组的复制方式进行使用:
 
map[ "eins"] = 1; 
map[ "sieben"] = 7; 
map[ "dreiundzwanzig"] = 23;
 
[]操作符同样也可以像数组一样取值。但是请注意,如果在一个非const的map中,使用[]操作符取一个不存在的Key的值,则这个Key会被自动创建,并将其关联的value赋予一个空值。如果要避免这种情况,请使用QMap<K, T>的value()函数:
 
int val = map.value( "dreiundzwanzig");
 
如果key不存在,基本类型和指针会返回0,对象类型则会调用默认构造函数,返回一个对象,与[]操作符不同的是,value()函数不会创建一个新的键-值对。如果你希望让不存在的键返回一个默认值,可以传给value()函数第二个参数:
 
int seconds = map.value( "delay", 30);
 
这行代码等价于:
 
int seconds = 30; 
if (map.contains( "delay")) 
        seconds = map.value( "delay");
 
QMap<K, T>中的K和T可以是基本数据类型,如int,double,可以是指针,或者是拥有 默认构造函数、 拷贝构造函数和 赋值运算符的类。并且 K必须要重载<运算符,因为QMap<K, T>需要按K升序进行排序。
 
QMap<K, T>提供了keys()和values()函数,可以获得键的集合和值的集合。这两个集合都是使用QList作为返回值的。
 
Map是单值类型的,也就是说,如果一个新的值分配给一个已存在的键,则旧值会被覆盖。如果你需要让一个key可以索引多个值,可以使用QMultiMap<K, T>。这个类允许一个key索引多个value,如:
 
QMultiMap< int, QString> multiMap; 
multiMap.insert(1,  "one"); 
multiMap.insert(1,  "eins"); 
multiMap.insert(1,  "uno"); 
 
QList<QString> vals = multiMap.values(1);
 
QHash<K, T>是使用散列存储的键-值对。它的接口同QMap<K, T>几乎一样,但是它们两个的实现需求不同。QHash<K, T>的查找速度比QMap<K, T>快很多,并且它的存储是不排序的。对于QHash<K, T>而言, K的类型必须重载了==操作符,并且必须被全局函数qHash()所支持,这个函数用于返回key的散列值。Qt已经为int、指针、QChar、QString和QByteArray实现了qHash()函数。
 
QHash<K, T>会自动地为散列分配一个初始大小,并且在插入数据或者删除数据的时候改变散列的大小。我们可以使用reserve()函数扩大散列,使用squeeze()函数将散列缩小到最小大小(这个最小大小实际上是能够存储这些数据的最小空间)。在使用时,我们可以使用reserve()函数将数据项扩大到我们所期望的最大值,然后插入数据,完成之后使用squeeze()函数收缩空间。
 
QHash<K, T>同样也是单值类型的,但是你可以使用insertMulti()函数,或者是使用QMultiHash<K, T>类来为一个键插入多个值。另外,除了QHash<K, T>,Qt也提供了QCache<K, T>来提供缓存,QSet<K>用于仅存储key的情况。这两个类同QHash<K, T>一样具有K的类型限制。
 
遍历关联存储容器的最简单的办法是使用Java风格的遍历器。因为Java风格的遍历器的next()和previous()函数可以返回一个键-值对,而不仅仅是值,例如:
 
QMap<QString,  int> map; 
... 
int sum = 0; 
QMapIterator<QString,  int> i(map); 
while (i.hasNext()) 
        sum += i.next().value();
 
如果我们并不需要访问键-值对,可以直接忽略next()和previous()函数的返回值,而是调用key()和value()函数即可,如:
 
QMapIterator<QString,  int> i(map); 
while (i.hasNext()) { 
        i.next(); 
         if (i.value() > largestValue) { 
                largestKey = i.key(); 
                largestValue = i.value(); 
        } 
}
 
Mutable遍历器则可以修改key对应的值:
 
QMutableMapIterator<QString,  int> i(map); 
while (i.hasNext()) { 
        i.next(); 
         if (i.value() < 0.0) 
                i.setValue(-i.value()); 
}
 
如果是STL风格的遍历器,则可以使用它的key()和value()函数。而对于foreach循环,我们就需要分别对key和value进行循环了:
 
QMultiMap<QString,  int> map; 
... 
foreach (QString key, map.keys()) { 
         foreach ( int value, map.values(key)) { 
                doSomething(key, value); 
        } 
} 

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/248373

QMap之自定义Key和Value 为什么要自定义QMap的 key和value呢?因为在某些应用场景,基本数据类型的key和value并不能满足要求,比如座位在第几行、第几列,座位上人的姓名、职务;二维坐标系中散点的横坐标、纵坐标,散点的id、result。即key和value是一种多对多的关系。需要注意的是自定义的CustomKey中要重载运算符 阅读详情

相关推荐

扫码器USB键盘报告描述符数据格式解析

Byte0用于判断Shift是否按下,当按下时Byte0的Bit1会置1,即0x02,若未按下,Bit为0,即0x00。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>未按下Shift。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>按下Shift。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出A。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出a。

m0_65548585的博客 1142

QT中,qmap 如何迭代获取key和value

中的任何内容,所以使用常量迭代器可以提高性能并确保代码的安全性。函数来获取迭代器的开始和结束位置。这是因为我们不需要修改。对象,并向其添加了三个键值对。本文解答来自Monica,记录我学习的过程。函数分别获取键和值,并将它们输出到控制台。对于每个键值对,我们使用。中的内容,则可以使用非常量迭代器。在这个示例中,我们创建了一个。

m0_48505336的博客 5038

Ubuntu单系统安装全攻略:从删除Windows到UEFI引导设置(避坑指南)

本文提供Ubuntu单系统安装的完整指南,涵盖从安全删除Windows系统到UEFI引导设置的详细步骤。通过专业工具准备、分区方案设计、引导加载器配置等关键环节,帮助用户避免常见安装问题,实现纯净高效的Ubuntu单系统环境。特别强调UEFI引导的深度配置与安装后的性能优化,适合希望彻底转向Linux的用户。

weixin_29210727的博客 409

Qt中QMap的简单说明及使用

QMap的说明 QMap属于Qt中的一种类型,使用者可以存储一对值(Key,value),以此便可通过Key来找到与其对应的值value。 我觉得说简单点其实就是将值value与Key相互关联、一一对应。两个值可以是相同类型或者是不同类型,通过Map来将二者联系。 一些简单的使用方法 首先先将Key和value值添加进去 QMap<QString,int> m_Map; //将value中的值插入至Key中的方法如下所示: m_Map[“KeyType1”]=658; m_Map[“KeyTy

weixin_38516302的博客 4748

台积电技术研发实力

台积电技术研发实力 台积电在半导体行业的地位毋庸置疑。他们究竟有多强大,大部分读者了解得可能非常片面。从最新公布的2019年财报里,看看台积电的真正实力。 一、台积电在市场上的地位 根据公司财报,台积公司在先进制程技术、特殊制程技术,以及先进封装技术的发展上持续领先全球集成电路制造服务领域,2019年的市场占有率为52%。台积公司总体营收以地区划分(主要依据客户营运总部所在地),来自北美市场的营收占台积公司总体营收的60%、日本与中国大陆以外的亚太市场占9%、中国大陆市场占20%、欧洲、中东及非洲市场占6

吴建明wujianming_110117 1901

Windows10完美驱动Apple Studio Display全攻略:从雷电转接到亮度调节(附N卡兼容列表)

本文详细介绍了在Windows10系统下如何完美驱动Apple Studio Display显示器,包括雷电接口转接方案、BootCamp驱动安装及NVIDIA显卡兼容性测试。特别推荐GTX 1660 Super等显卡,提供5K@60Hz稳定输出,并分享色彩管理及日常使用技巧,帮助用户充分发挥这款苹果显示器的性能。

weixin_29284657的博客 1089

Qt学习之路(37): Qt容器类之关联存储容器QMap<K, T>和QHash<K, T>

Qt学习之路(37): Qt容器类之关联存储容器 2009-12-24 13:58:58 标签:C++ 教程 学习 QT教程 Qt 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/248373 今天我们来说说Qt容器类中的关联存储容器。所谓关

haiross的专栏 1983

YOLOv11改进 - 卷积Conv | SPD-Conv空间深度转换卷积优化空间信息编码,攻克小目标检测难题

本文介绍了一种名为SPD-Conv的新型CNN构建块及其在YOLOv11中的结合。传统CNN在处理低分辨率图像或小物体时,因使用步长卷积和池化层导致细粒度信息丢失、性能下降。SPD-Conv由空间到深度(SPD)层和非步长卷积(Conv)层组成,完全消除卷积步长和池化层,避免信息损失。SPD层重排特征图元素将空间信息转换到深度维度,非步长卷积层进一步处理特征图。我们将SPD-Conv集成进YOLOv11,实验证明其在低分辨率图像和小物体检测任务上显著优于现有模型。

魔改工程师的博客 1141

day05(Qt)常用类

常用类

QR70892的博客 1136

Ansible 面板工具之AWK ( Anssible Tower )界面介绍

整理这部分笔记博文内容为AWX和UI 界面的简单介绍理解不足小伙伴帮忙指正傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波这里AWX使用的是最新的版本AWX 21.7.0目前最新版是3.8.6,博客中的版本为3.5.0对于Redhat的,官网上看到在 2022 年 11 月之后不在维护了,改版之后现在叫,感兴趣小伙伴可以了解下虽然有AWX是。

山河已无恙 1303

在 SAP BTP 上为应用开启多租户能力:基于 SaaS Provisioning 和 XSUAA 的完整实践指南

本文介绍了在SAP BTP上配置多租户应用的实战指南。主要内容包括: 多租户架构概述:解释provider子账户、consumer子账户和tenant的概念,以及数据隔离机制。 安全配置:在xs-security.json中设置tenant-mode为shared,并为SaaS Provisioning服务添加回调scope授权。 路由配置:通过manifest.yml设置TENANT_HOST_PATTERN来定义多租户访问模式,确保不同租户通过不同子域名访问同一应用。 服务绑定:将XSUAA和SaaS

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 145

Qt_day5_常用类

#QString 字符串类 #容器类 #顺序容器QList #关联容器QMap #几种Qt数据类型 #跨平台数据类型 #QVariant 统一数据类型 #QStringList 字符串列表 #QDateTime 日期时间类 #生成随机数 #QTimer 定时器类

weixin_63791423的博客 1129

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Qt4学习之路

Qt学习之路(1):前言 131274/17 FinderCheng 2009-08-20 Qt学习之路(2):Hello, world! 129097/23 FinderCheng 2009-08-20 ...

qq_39160037的博客 258

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

QString 字符串类

这些容器类是隐式共享和可重入的,而且它们进行了速度和存储优化,因此可以减少可执行文件的大小。QList 是最常用的容器类,虽然它是以数组列表的形式实现的,但是在其前或后添加数据非常快,QList以下标索引的方式对数据项进行访问。,支持常见各国字符,因此一个字符是一个16位的QChar,而不是之前C++/C中8位的char,因此QString处理中文没有问题,且一个汉字算作一个字符。如果是一次性定时器,此属性表示延迟时间;QString的API非常多,以下是常用API的相关词汇,需要做到英译汉的水平。

weixin_63207763的博客 2493

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

QT6开发笔记

1、 一个类:有变量有方法所以一个类包括cpp文件和h头文件2、每次创建一个类对象,就会执行一次构造函数;

qq_36658033的博客 346
上一篇: Qt学习之路(36): Qt容器类之遍历器和隐式数据共享
下一篇: Qt学习之路(38): model-view架构
flowingFire2012
博客等级 码龄14年 6粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值