(二十七)Qt容器之关联容器

QT QMap QMultiMap使用说明 文章目录1.简介2.使用示例3.解析 1.简介 QMap<Key, T>: 它提供了一个字典(关联数组),将Key类型的键值映射到T类型的值上。一般每一个键关联单一的值。QMap使用键顺序来存储它的数据;如果不关心存储顺序,那么可以使用QHash来代替它,因为QHash速度更快。 QMultiMap<Key, T>: 它是QMap的一个便捷类,提供了实现多值映射的接口函数,例如一个键可以关联多个值。 2.使用示例 #include <QCoreApplication> # 阅读详情

Qt中关联容器(容器存储的是<键,值>对)有:QMap(skip-list-based字典)、QMultiMap、QHash(哈希表)、QMultiHash、QSet

 

关联容器的引入:

首先,我们看看数组的概念。数组可以看成是一种<int-Object>形式的键-值对,它的Key只能是int,而值的类型是Object,也就是任意类型(注意,这里我们只是说数组可以是任意类型,这个Object并不必须是一个对象)。现在我们扩展数组的概念,把Key也做成任意类型的,而不仅仅是int,这样就是一个关联容器了。

 

QMap skip-list-based字典:

1、QMap<K, T>是一个以升序键顺序存储键值对的容器

2、QMap<K, T>重载了operator[],可以以数组的方式使用QMap<K,T>

3、QMap<K, T>中的k与T可以是基本数据类型,也可以是类类型

 

注意事项:

1、 之前说过容器内存储元素的要求,k与T必须都满足要求,同时,如果k是类类型,必须提供重载的operator<

2、  QMap<K, T>如果是non-const的,使用operator[]操作的k获取T时,如果k存在,返回对应T,如果k不存在,则会用给定的k和T对应的”零”值创建一个新项,并返回T对应的”零”值

3、  使用成员

const T

value ( const Key & key ) const

可以避免意外地创建”零”值,如果K不存在,返回T对应的”零”值,但不会创建新项

4、  K与T的映射一般是单一的:当插入键值对时,如果k存在,更新T的值,当K不存在,插入新的键值对

5、想要一个K对应多个T,使用QMulitMap类或成员函数

iterator

insertMulti ( const Key & key, const T & value )

 

#include <QtCore/QCoreApplication>
#include <QDebug>
#include <QMap>
#include <QMapIterator>
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QMap<QString, int> map;                
 
   map.insert("key 2", 2);             //故意逆k插入键值对
   map.insert("key 1", 1);
   map.insert("key 0", 0);
 
QList<QString>kList = map.keys(); //获取全部键 
 
   for(int i=0; i<kList.count(); i++)
    {
       qDebug() << kList[i];
    }
 
   QList<int> vList = map.values();       //获取全部值
 
   for(int i=0; i<vList.count(); i++)
    {
       qDebug() << vList[i];
    }
 
   QMapIterator<QString, int> it(map);      //迭代器指向map的第一个元素的前一个位置(java风格迭代器)
 
   while( it.hasNext() )         
    {       
       it.next();                              //指向第一个元素
 
       qDebug() << it.key() << " : " << it.value();                 
    }
   
   return a.exec();
}


QHash(哈希表):

1、QHash<K, T>中的键值对在内部无序排列

2、QHash<K, T>重载了operator[],可以以数组的方式使用QHash<K,T>

3、QHash<K, T>中的k与T可以是基本数据类型,也可以是类类型

4、QHash<K, T>为其内部的哈希表自动分配最初存储区域并在有元素插入或删除时重新划分所分配存储区域大小

 

注意事项:

1、 之前说过容器内存储元素的要求,k与T必须都满足要求,同时,如果k是类类型,必须提供重载的operator=

2、  必须提供了重载的全局函数qHash()以返回键的哈希值,Qt已经提供了支持整型、指针型、QChar、QString以及QByteArray的全局qHash()函数

3、  如果non-const,使用operator[]时,K不存在会有与QMap<K,T>同样的问题,且解决办法相同

4、  K与T的映射一般是单一的:当插入键值对时,如果k存在,更新T的值,当K不存在,插入新的键值对

5、想要一个K对应多个T,使用QMultiHash类或成员函数

iterator

insertMulti ( const Key & key, const T & value )

6、一般,先以我们期望的最大值为参数调用成员函数

void

reserve ( int size )

后插入元素,最后调用成员函数

void

squeeze ()

以减少QHash<K, T>的内存使用,调整性能

 

#include <QtCore/QCoreApplication>
#include <QDebug>
#include <QHash>
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QHash<QString, int> hash;
 
   hash.insert("key 2", 2);            //插入键值对
   hash.insert("key 1", 1);
   hash.insert("key 0", 0);
 
   QList<QString> kList = hash.keys(); //获取全部键
 
   for(int i=0; i<kList.count(); i++)
    {
       qDebug() << kList[i];
    }
 
   QList<int> vList = hash.values();      //获取全部值
 
   for(int i=0; i<vList.count(); i++)
    {
       qDebug() << vList[i];
    }
 
   hash["key 4"] = 4;                               
 
   QHash<QString, int>::const_iterator i;                     // STL_Styl风格迭代器
 
   for(i=hash.constBegin(); i!=hash.constEnd(); ++i)  //constBegin指向第一个元素,constEnd指向最后一个元素的尾后
    {
       qDebug() << i.key() << " : " << i.value();
    }
   
   return a.exec();
}

 

QSet:

QSet<K>仅存储键,其内部依赖于QHash<K,T>

 

QMap<K, T>与QHash<K, T>对比分析

QMap<K, T>和QHash<K, T>接口相同,可直接替换使用

1、  QHash<K, T>的查找速度明显快于QMap<K, T>

2、  QHash<K, T>占用的存储空间明显多于QMap<K, T>

3、  QHash<K, T>以任意方式存储元素

4、  QMap<K, T>以K顺序存储元素

5、  Qhash<K, T>的K类型必须提供operator=与全局函数qHash()

6、  QMap<K, T>的键类型必须提供函数operator<


 

 

 

 

 

Qt入门教程-用QMultiMap实现键值存储 这个例子中,我们创建了一个QMultiMap对象,然后插入了一些键值对。通过调用values()方法,我们可以获取所有和某个键值关联的值。通过调用constBegin()和constEnd()方法,我们则可以获取所有的键值对。QMultiMap是Qt提供的一个键值存储类,它和QMap类似,不过QMultiMap可以存储多个和同一个键值关联的值。综上所述,QMultiMap是Qt提供的一种非常实用的数据结构,它可以帮助我们灵活地存储和获取键值对。下面我们演示一个使用QMultiMap进行键值存储的例子。 阅读详情

相关推荐

QT的QMultiHash类的使用详解

这个函数返回一个QMultiHash::iterator对象,它指向包含给定键和值的第一个元素。通过使用QMultiHash类,我们可以轻松地将多个键映射到单个值上,并执行基本的插入、查找和删除操作。在QT中,QMultiHash类是一个非常有用的容器类,它允许我们将多个键映射到单个值上。这非常适合存储多个值的情况,因为我们可以轻松地添加新的键和值,而不用关心是否已经存在该键。我们可以使用remove()函数来删除QMultiHash中所有包含给定键和值的元素。要添加元素,我们使用insert()函数。

TechRoarX的博客 281

Qt QMultiMap

今天在观摩小伙伴撸代码的时候,突然听到了QMultiMap自己使用Qt开发这么就,竟然都不知道,所以趁没有被人发现自己是个水货,赶紧补充一下知识点。今天就学习一下QMultiMap。

DreamLife&Yaothos 982

QT的QMultiMap类的使用

详细说明 QMultiMap类是提供多值地图的便捷QMap子类。 QMultiMap <Key,T>是Qt的通用容器类之一。它继承了QMap并扩展了一些便利功能,使其比QMap更适合于存储多值地图。多值映射是允许使用同一键的多个值的映射。 QMap通常不允许这样做,除非您调用QMap :: insertMulti()。 由于QMultiMap继承了QMap,因此QMap的所有功能也适用于QMultiMap。例如,可以使用isEmpty()测试地图是否为空,并且可以使用QMap的迭代器类(例如QM

希望我的博客,能帮上你解决学习中工作中所遇到的问题 3247

QMultimap遍历

QMulitimap当存在多个key相同的时的遍历方式需要注意。不能随意使用for(auto v:map)进行遍历

J_admin的博客 773

第六章节 Qt的关联与集合容器

Qt 关联容器: QMap, QHash, QMultiMap,QMultiHashQt 集合容器:QSet。

m0_65635427的博客 404

Altera USB-Blaster在Win10/Win11的驱动兼容性处理

解决Altera USB-Blaster在Windows 10和Windows 11系统下的驱动兼容性问题,详细演示如何手动安装与更新altera usb-blaster驱动安装,确保下载电缆正常识别,提升开发调试效率。

weixin_42284380的博客 1290

深入剖析 Qt QMultiMap :原理、应用与技巧

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 5459

手把手教你用Simulink搭建BPSK调制解调系统(附完整参数设置与波形分析)

本文详细指导如何使用Simulink搭建BPSK调制解调系统,涵盖从理论到实践的全流程,包括参数设置、模块连接和波形分析。重点解析调制解调中的关键参数和常见问题,如带通滤波器设计、载波同步等,帮助读者快速掌握BPSK系统的实现与调试技巧。

weixin_27741699的博客 423

第三篇:跨平台QT开发-容器

隐式数据共享机制去最大化资源有效利用和最小化复制克隆操作。隐式共享类当作为函数参数传递的时候,不 仅安全而且效率很高,因为传递的时候只是传递的数据的指针,数据本身只当自己被修改的时候才会去复制。简称写时复制。数据相同时,执行浅拷贝,仅复制指向数据块的指针数据不同时则执行深拷贝。隐式共享技术可以大大降低对内存的开销及 CPU 资源的消耗,很大程度提高应用程序的运行效率QString类保存了16位的Unicode值,Unicode把所有语言都统一到一套编码里,Unicode提供。

qq_48397625的博客 1191

手把手教你学Simulink实例:基于Simulink的超级电容器充放电仿真

超级电容器(Supercapacitor)是一种高容量电容器,具有快速充放电能力、长寿命和高功率密度等优点。它在能量存储系统、电动汽车、不间断电源(UPS)等领域有广泛应用。为了更好地理解和设计超级电容器的应用系统,通常需要进行详细的仿真分析。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证超级电容器充放电系统的控制策略。本教程将详细介绍如何使用 Simulink 进行超级电容器充放电的仿真实例。通过本教程,我们详细介绍了如何使用 Simulink 进行超级电容器充放电的仿真实例。

MHD0815的博客 581

制作INCA和CANape通用的A2L

CANape和INCA通用的A2L配置与修改

赞的博客 5962

[QT_035]Qt学习之关联容器:QHash、QMultiHash和QSet

Qt学习之关联容器:QHash、QMultiHash和QSet

kongcheng253的博客 2124

华为OD机试真题2025双机位A卷 Java&Go 实现【采购订单】

在一个采购系统中,采购申请(PR)需要经过审批后才能生成采购订单(PO)。每个PR包含商品的单价(假设相同商品的单价一定是一样的)及数量信息。系统要求对商品进行分类处理:单价高于100元的商品需要单独处理,单价低于或等于100元的相同商品可以合并到同一采购订单PO中。针对单价低于100的小额订单,如果量大可以打折购买。

MISAYAONE的博客 1258

深入剖析 Qt QMultiHash:原理、应用与技巧

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3318

C#上位机+YOLOv8实战:摄像头/视频流实时目标检测(工业级优化+完整可运行源码)

纯C#实现,无Python依赖,适配工业工控机部署;工业级优化:解决帧率、内存、鲁棒性三大核心问题;代码完整可复用,支持摄像头/视频流/RTSP多源检测;避坑指南覆盖开发中90%的常见问题,降低落地成本。相较于传统方案,该方案兼顾实时性与易用性,成本仅为商用视觉库的1/10,可快速落地到工业质检、安防、物流等场景。后续可拓展方向包括:自定义数据集训练、GPU加速推理、工业通信(PLC/串口)对接等。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 733

SXU—软件测试方法和技术-朱少民-第四部分 软件测试流程和规范-附考点

软件测试方法和技术-朱少民-第四章 软件测试流程和规范—这本书最后一部分的考点整理,考点分析

weixin_63597914的博客 1752

C++ Qt开发:使用关联容器类

Qt 中提供了丰富的容器类,用于方便地管理和操作数据。这些容器类涵盖了各种不同的用途,从简单的动态数组到复杂的映射和集合。本章我们将主要学习关联容器,主要包括 `QMap` ,`QSet`和 `QHash`,它们提供了键值对存储和检索的功能,允许通过键来快速查找值。

微软技术分享 8707

【系统分析师】2026年-上半年真题:综合知识-答案及详解(75题完整回忆版)

系统分析师考试备考指南(2026上半年机考) 考试安排: 2026年5月23日举行,分三科连考: 综合知识+案例分析(08:30-12:30,240分钟) 论文(14:30-16:30,120分钟) 科目详情: 综合知识:75道单选(含5道英文题),满分75分,45分及格。 案例分析:5选3主观题,满分75分,45分及格。 论文:4选1论述题,满分75分,45分及格。 重点题型解析: 软件工程:结构化分析以数据字典为核心(题1)。 概率统计:独立事件概率计算(题2,三人解题概率≈0.9)。 数据库安全:DB

数据知道的博客 1889

【Qt】一文总结Qt关联容器类—QMap

一文总结Qt关联式容器类—QMap 一、开篇 ​ QMap是一个模板类,它提供了一个基于红黑树的字典。QMap<Key, T>是Qt的一个通用容器类。它存储(键、值)对,并提供与键关联的值的快速查找方法。 ​ ​ QMap和QHash具有非常类似的功能。两者的差异是:QHash提供了比QMap更快的平均查找速度。在遍历QHash时,项目是任意排序的。使用QMap,项目按键排序的。 二、QMap的使用方法 (2-1)创建QMap。 ​ 例如: QMap<QString,int>map;

iriczhao的博客 3182

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

QMultiMap

QT 容器类之关联存储容器 - 放飞你的梦想 Seany's Blog - 博客频道 - youkuaiyun.comMap是单值类型的,也就是说,如果一个新的值分配给一个已存在的键,则旧值会被覆盖。如果你需要让一个key可以索引多个值,可以使用QMultiMap&lt;K, T&gt;。这个类允许一个key索引多个value,如: QMultiMap&lt;int, QString&gt; multiMap...

weixin_34232744的博客 1076

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

QMultiMap使用

QMultiMap与QMap 操作可以说完全一样,只不过QMultiMap继承自QMap,并实现了一个key 对应多个value(通过插入多个相同key的值)。 由于一个key对应了多个值,所以QMultiMap取消了对”[]”的定义 Unlike QMap, QMultiMap provides no operator[]. Use value() or replace() if...

coologic 1590

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Qt 顺序容器类与关联容器类

众所周知,C++中存在很多容器类。同样,Qt中也有很多容器类,而且Qt中的容器类在存取速度、内存开销等方面进行了优化,使用起来更轻量级、更便捷还有很重要的一点--它们是线程安全的。具体介绍容器之前,先要了解 Qt容器的一个特性。Qt容器类都是基于模板的类,比如常用的OList,这里的T表示的就是具体的类型,而且必须是可赋值的数据类型。这意味着该数据类型必须提供一个默认的构造函数、赋值构造函数和赋值运算符。

atomy_iiii的博客 1522

qt -- 容器类

目录 一、顺序容器类 1、QList 2、QLinkedList 3、QVector 4、QStack 5、 QQueue 二、关联容器类 1、QSet 2、QMap 3、QMultiMap 4、QHash 5、QMultiHash 一、顺序容器类 顺序容器类有: QList、QLinkedList、QVector、QStack 、QQueue。 1、QList QList以数组列表的形式实现的,在其前或后添加数据非常快,QList 以下标索引的方式进行数据的访问。..

ccr的博客 999

Qt的容器

隐式共享又称写时复制,一个共享类由指向一个共享数据块的指针和数据组成,共享数据块中包含一个引用计数。引用计数在对象被创建时为1,当有新对象引用数据时,引用计数会+1,当引用计数为0时,自动销毁数据。和QString类似,但QBytearray没有arg(),QByteArrary总会保证以'\0'结尾。.arg(s1).arg(s2).arg(s3) %的编号从小到大取。根据%x x的取值范围为(1~99),根据编号来替换字符。precision 精度(小数点后的位数)使用

qq_45303986的博客 1526

QT基础六、关联容器和集合容器

Qt关联容器:QMultiHashQt集合容器:QSetC++的map,是关联容器,用来存储“键值对”。QMap和std::map类似。底层都是使用“平衡二叉树”(红黑树)来存储数据是有序关联容器。

m0_75107602的博客 834

QT内置容器

QT中的容器分为:顺序容器和关联式容器顺序(sequence)容器一个接一个地存储项QList、QVector(在QT6中QVector是QList的别名)而关联(ordered)容器存储键值对。QSet、QMap。

m0_58233509的博客 540
上一篇: (二十六)Qt容器之顺序容器
下一篇: (二十八)Qt中的事件处理
早起的虫儿灬
博客等级 码龄10年 54粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值