QT —— <QHash> 存储 & 使用 & 遍历_qhash遍历-程序员宅基地

技术标签: QT  QHash  

1. 定义:QHash <Key,T>  存储 (键,值) 对,并提供与键相关的值的非常快速的查找。

2. QHash 和 QMap 比较:  QHash提供与QMap非常相似的功能。 不同之处是:

  •     QHash提供比QMap更快的查找。
  •     迭代器遍历QMap时 ,项(items)始终按键排序。 使用QHash ,这些项是任意排序的。
  •     QMap的键类型必须提供运算符 <() 。 QHash的键类型必须提供运算符 ==() 和一个名为 qHash() 的全局哈希函数。

一、示例

#include <QCoreApplication>
#include <QHash>
#include <QHashIterator>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    QHash<QString, int> hash;      //定义hash, key:QString, value:int
    
    hash["one"] = 1;               //插入数据,方法1: value: <"one",1>
    hash.insert("two", 2);         //插入数据,方法2: value: <"two",2> 
                                   //insert方法进行插入的,每个键只允许一个值
                                   //如果一个键插入多个值,使用QHash::insertMulti(const Key &key, const T &value)


    int num1 = hash["one"];         //获取数据,方法1: value: 1
    int num2 = hash.value("two");   //获取数据,方法2: value: 2
    
    int time = 30;
    if (hash.contains("time"))          //查询数据,方法1: value: time  = 30
    {
        time = hash.value("time");
    }                                 
    
    int time2 = hash.value("time", 40); //查询数据,方法2: value: time2 = 40
                                        //未查询到,使用第二个参数作为默认值进行返回
    
    hash2.capacity();                   //检索大小: value: 10
    
    //**STL样式迭代器遍历**
    QHash<QString, int>::const_iterator iter1 = hash.constBegin(); //遍历hash,方法1
    while(iter1 != hash.constEnd())
    {
        qDebug() << iter1.key() << ": " << iter1.value();
        ++iter1;
    }    

    //**java样式迭代器遍历**
    QHashIterator<QString, int> iter(hash);                        //遍历hash,方法2
    while(iter.hasNext())
    {
        iter.next();
        qDebug() << iter.key() << ": " << iter.value();
    }
    
    //**检索键的所有值**
     QList<int> values = hash.values("one");            //检索key:"one",的所有值
    for (int i = 0; i < values.size(); ++i)             //对应的插入接口为insertMulti()
    {
        qDebug() << values.at(i);                   
    }
    
    //**检索某个键**
    QHash<QString, int>::iterator iter2 = hash.find("two");  //检索key:"two"
    while(iter2 != hash.end() && iter2.key() == "two")
    {
        qDebug() << iter2.value();                  
        ++iter2;
    }
    
    //**从hash而不是键中提取值**
    foreach (int value, hash)
    {
        qDebug() << value;
    }   

    return a.exec();
}

 

二、函数(详细说明)

1.  operator[]() :将(键,值)对插入到 hash 中

QHash<QString, int> hash;
hash["one"] = 1;                //value: <"one",1>

 

2.  insert()  :将(键,值)对插入到 hash 中。
注:QHash 每个键只允许一个值。如果你使用  insert() 插入一个已存在的键,则会删除先前的值。如果想为每个键存储多个值,用  insertMulti()。对应的两套接口为:

  • insert() —— value()
  • insertMulti() —— values()
QHash<QString, int> hash;
hash.insert("two", 2);          //value: <"two",2>

 

3. operator[]() or value():查找值

QHash<QString, int> hash;
int num1 = hash["one"];         //value: 1
int num2 = hash.value("two");   //value: 2

 

4. contains():检查哈希是否包含特定键

QHash<QString, int> hash;
int time = 30;
if (hash.contains("time"))
{
    time = hash.value("time");
}  

 

5. contains(key, value)检查哈希是否包含特定键,如果没有指定键的项,则使用其第二个参数作为默认值

QHash<QString, int> hash;
int time = 30;
if (hash.contains("time"))
{
    time = hash.value("time", 40); //value: time2 = 40
}  

注:建议使用  contains() 和 value() 而不是 operator[]() 来查找哈希中的键。原因是使用 operator[]() 时,如果hash中没有这个项存在,默认将项插入到 hash 中,除非 hash 是 const

 

  •  contains() & value()  与  operator[]() 查找 hash键 如下:
//错误方式,这将在内存中创建10个item
QHash<int, int> hash2;
for (int i = 0; i < 10; ++i)
{
    if (hash2[i] == 1)
    {
            qDebug() << hash2[i];
    }
}   //value:<2,0><0,0><1,0>....(10个项)
    
//正确方式
QHash<int, int> hash3;
for (int i = 0; i < 10; ++i)
{
    if (hash3.value(i) == 1)
    {
        qDebug() << hash3.value(i);
     }
}   //value:(0个项)

 

6. capacity():检索 hash 大小

QHash<int, int> hash2;
hash2.capacity();        

 

7.  QList<T> values(const Key &key):检索键的所有值,它返回 QList<T>

QHash<QString, int> hash;
QList<int> values = hash.values("one");
for (int i = 0; i < values.size(); ++i)
{
    qDebug() << values.at(i);                
}

 

8.  find():获取带有键的第一个项的迭代器,并从那里迭代。

QHash<QString, int> hash;
QHash<QString, int>::iterator iter2 = hash.find("two");
while(iter2 != hash.end() && iter2.key() == "two")
{
    qDebug() << iter2.value();                  
    ++iter2;
}

 

9.  foreach():从哈希(而不是键)中提取值,获取hash中的每个值

QHash<QString, int> hash;
foreach (int value, hash)
{
    qDebug() << value;
}   

 

10.  remove() 或 QMutableHashIterator::remove():删除任意给定键的项

11.  clear():清除整个 hash

12. erase():删除某个键对应的项,与  remove() 和 take() 不同, 该函数不会打乱QHash内部数据结构

 

 

三、QHash 遍历

两个方式都可以,可根据习惯使用

1. java样式迭代器遍历

QHash<QString, int> hash;
QHashIterator<QString, int> iter(hash);
while(iter.hasNext())
{
    iter.next();
    qDebug() << iter.key() << ": " << iter.value();
}

 

2. STL样式迭代器遍历

QHash<QString, int> hash;
QHash<QString, int>::const_iterator iter1 = hash.constBegin();
while(iter1 != hash.constEnd())
{
    qDebug() << iter1.key() << ": " << iter1.value();
    ++iter1;
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Jecklin_online/article/details/82909228

智能推荐

spring注解@ControllerAdvice的原理分析和使用_controlleradvice原理-程序员宅基地

文章浏览阅读1w次,点赞10次,收藏17次。@ControllerAdvice注解是Spring3.2中新增的注解,学名是Controller增强器,作用是给Controller控制器添加统一的操作或处理。对于@ControllerAdvice,我们比较熟知的用法是结合@ExceptionHandler用于全局异常的处理,但其作用不止于此。ControllerAdvice拆开来就是Controller Advice,关于Advice,在Spring的AOP中,是用来封装一个切面所有属性的,包括切入点和需要织入的切面逻辑。这里ControllerA_controlleradvice原理

改善侧滑菜单Fragment切换速度(解决Fragment切换加载慢的问题)_new fragment有点慢-程序员宅基地

文章浏览阅读3.9k次。1.现状:在做项目的时候很多时候需要使用侧滑菜单。侧滑菜单项一般都是用Fragment。一般设计上是在Home page的layout中使用FrameLayout 作为一个container 如:content_main.xml

在Google使用Borg进行大规模集群的管理 7-8-程序员宅基地

文章浏览阅读606次。为什么80%的码农都做不了架构师?>>> ..._google trace batch job

python加密字符串小写字母循环后错两位_python学习:实现将字符串进行加密-程序员宅基地

文章浏览阅读2.6k次,点赞3次,收藏3次。'''题目描述1、对输入的字符串进行加解密,并输出。2加密方法为:当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;其他字符不做变化。s'''#-*-coding:utf-8-*-importre#判断是否是字母defisLetter(letter):iflen..._编写函数fun2实现字符串加密,加密规则为:如果是字母,将其进行大小写转换;如果

【Java容器源码】集合应用总结:迭代器&批量操作&线程安全问题_迭代器是否可以保证容器删除和修改安全操作-程序员宅基地

文章浏览阅读4.4k次,点赞6次,收藏8次。下面列出了所有集合的类图:每个接口做的事情非常明确,比如 Serializable,只负责序列化,Cloneable 只负责拷贝,Map 只负责定义 Map 的接口,整个图看起来虽然接口众多,但职责都很清晰;复杂功能通过接口的继承来实现,比如 ArrayList 通过实现了 Serializable、Cloneable、RandomAccess、AbstractList、List 等接口,从而拥有了序列化、拷贝、对数组各种操作定义等各种功能;上述类图只能看见继承的关系,组合的关系还看不出来,比如说_迭代器是否可以保证容器删除和修改安全操作

养老金融:编织中国老龄社会的金色安全网

在科技金融、绿色金融、普惠金融、养老金融、数字金融这“五篇大文章”中,养老金融以其独特的社会价值和深远影响,占据着不可或缺的地位。通过政策引导与市场机制的双重驱动,激发金融机构创新养老服务产品,如推出更多针对不同年龄层、风险偏好的个性化养老金融产品,不仅能提高金融服务的可获得性,还能增强民众对养老规划的主动参与度,从而逐步建立起适应中国国情、满足人民期待的养老金融服务体系。在人口老龄化的全球趋势下,中国养老金融的发展不仅仅是经济议题,更关乎社会的稳定与进步。养老金融:民生之需,国计之重。

随便推点

Mybatis学习笔记(传智播客)(完结)_传智接口测试笔记-程序员宅基地

文章浏览阅读9.6k次,点赞24次,收藏113次。说明:本文由大量的源代码,及截图,建议读者,操作一遍。ide:IDEA。文末有笔记及视频分享Mybatis数据表的sql下载 密码: xjjw1、对原生态jdbc程序(单独使用jdbc开发)问题总结先来看一部分代码Public static void main(String[] args) { Connection connection ..._传智接口测试笔记

快排 python简洁版_快速排序的四种python实现(推荐)-程序员宅基地

文章浏览阅读119次。快速排序算法,简称快排,是最实用的排序算法,没有之一,各大语言标准库的排序函数也基本都是基于快排实现的。本文用python语言介绍四种不同的快排实现。1. 一行代码实现的简洁版本quick_sort = lambda array: array if len(array) <= 1 else quick_sort([item for item in array[1:] if item <...

设计模式六大原则(2):里氏替换原则-程序员宅基地

文章浏览阅读442次。设计模式六大原则(2):里氏替换原则 作者:zhengzhb 地址:http://www.uml.org.cn/sjms/201211023.asp#1 肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑。其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的。定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2

基于psk和dpsk的matlab仿真,MATLAB课程设计-基于PSK和DPSK的matlab仿真-程序员宅基地

文章浏览阅读623次。MATLAB课程设计-基于PSK和DPSK的matlab仿真 (41页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!9.90 积分武汉理工大学MATLAB课程设计.目录摘要 1Abstract 21.设计目的与要求 32.方案的选择 42.1调制部分 42.2解调部分 43.单元电路原理和设计 63.1PCM编码原理及设计 63.1.1PCM编码原理 ..._通信原理课程设计(基于matlab的psk,dpsk仿真)(五篇模版)

腾讯微搭小程序获取微信用户信息_微搭 用微信号登录-程序员宅基地

文章浏览阅读3.5k次,点赞6次,收藏28次。腾讯微搭小程序获取微信用户信息无论你对低代码开发的爱与恨, 微信生态的强大毋庸置疑. 因此熟悉微搭技术还是很有必要的! 在大多数应用中, 都需要获取和跟踪用户信息. 本文就微搭中如何获取和存储用户信息进行详细演示, 因为用户信息的获取和存储是应用的基础.一. 微搭每个微搭平台都宣称使用微搭平台可以简单拖拽即可生成一个应用, 这种说法我认为是"夸大其词". 其实微搭优点大致来说, 前端定义了很多组件, 为开发人员封装组件节省了大量的时间,这是其一; 其二对后端开发来说, 省去了服务器的部署(并没有省去后_微搭 用微信号登录

sql中索引的使用分析

sql中索引的使用分析

推荐文章

热门文章

相关标签