版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
本文标题:QHash和QMultiHash使用     本文地址:http://techieliang.com/2017/12/557/

1. 介绍

QHash<Key, T>是一个在哈希表中存储键值对的数据结构。它的接口几乎与QMap<Key,
T>相同,但是与QMap<Key, T>相比,它对ey的模板类型有不同的要求,而且它提供了比QMap<Key,
T>更快的查找功能。

The key type of a QMap must provide operator<(). The
key type of a QHash must provide operator==() and a global hash function
called qHash() (see qHash).

QMap需要提供operator<()。QHash<K,
T>中K的值类型还需要提供一个operator==(),并需要一个能够为键返回哈希值的全局qHash()函数的支持。Qt已经为qHash()函数提供了对整型、指针型、QChar、QString以及QByteArray。

QMultiHash类似于QMultiMap相对于QMap的,实现了但key对应多值。

相关帮助文档:QHashQMultiHash

2. 简单范例

2.1. QHash

  1. #include <QHash>
  2. #include <QDebug>
  3. QHash<QString,int> m_map;
  4. m_map["a"] = 10;
  5. m_map["a"] = 11;
  6. m_map["as"] = 13;
  7. m_map.insert("b",22);//同key不同value
  8. m_map.insert("b",23);
  9. m_map.insert("ba",55);
  10. m_map.insert("ba",56);
  11. m_map.insert("t1",77);//同value不同key
  12. m_map.insert("t2",77);
  13. auto find_index = m_map.find("as");
  14. if(find_index!=m_map.end()) {
  15. qDebug()<<find_index.key()<<find_index.value();
  16. }
  17. qDebug()<<m_map.value("a");
  18. qDebug()<<m_map.value("b");
  19. qDebug()<<m_map.value("aa");
  20. qDebug()<<m_map.values("b");//测试同key不同value
  21. qDebug()<<m_map.key(22);
  22. qDebug()<<m_map.key(77);
  23. qDebug()<<m_map.keys(77);//测试同value不同key

结果

  1. "as" 13
  2. 11
  3. 23
  4. 0
  5. (23)
  6. ""
  7. "t2"
  8. ("t2", "t1")

2.2. QMultiHash

  1. QMultiHash<QString,int> m_map;
  2. //m_map["a"] = 10;
  3. //m_map["a"] = 11;
  4. //m_map["as"] = 13;
  5. m_map.insert("b",22);//同key不同value
  6. m_map.insert("b",23);
  7. m_map.insert("ba",55);
  8. m_map.insert("ba",56);
  9. m_map.insert("t1",77);//同value不同key
  10. m_map.insert("t2",77);
  11. auto find_index = m_map.find("as");
  12. if(find_index!=m_map.end()) {
  13. qDebug()<<find_index.key()<<find_index.value();
  14. }
  15. qDebug()<<m_map.value("a");
  16. qDebug()<<m_map.value("b");
  17. qDebug()<<m_map.value("aa");
  18. qDebug()<<m_map.values("b");//测试同key不同value
  19. qDebug()<<m_map.key(22);
  20. qDebug()<<m_map.key(77);
  21. qDebug()<<m_map.keys(77);//测试同value不同key
  22. //修改必须用replace
  23. m_map.replace("b",25);//讲第一个key=b的修改为了25
  24. m_map.replace("t3",77);//由于没有t3=77所以新增加了一个
  25. qDebug()<<m_map.values("b");
  26. qDebug()<<m_map.keys(77);

结果

  1. 0
  2. 23
  3. 0
  4. (23, 22)
  5. "b"
  6. "t1"
  7. ("t1", "t2")
  8. (25, 22)
  9. ("t1", "t2", "t3")

3. 自定义类型实现hash

QSet使用-自定义类型,QSet也是利用哈希表实现,原理相同。

转载请以链接形式标明本文标题和地址:Techie亮博客 » QHash和QMultiHash使用

QHash和QMultiHash使用的更多相关文章

  1. C++中的容器类详解

    一.STL容器类 STL(Standard Template Library)的六大组件:容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adap ...

  2. Qt 学习之路:存储容器

    存储容器(containers)有时候也被称为集合(collections),是能够在内存中存储其它特定类型的对象,通常是一些常用的数据结构,一般是通用模板类的形式.C++ 提供了一套完整的解决方案, ...

  3. Qt 中一些常用类中文说明

    Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进 ...

  4. Qt——容器类(译)

    注:本文是我对Qt官方文档的翻译,错误之处还请指正. 原文链接:Container Classes 介绍 Qt库提供了一套通用的基于模板的容器类,可以用这些类存储指定类型的项.比如,你需要一个大小可变 ...

  5. Qt 学习之路 2(38):存储容器

    Qt 学习之路 2(38):存储容器 豆子 2013年1月14日 Qt 学习之路 2 38条评论 存储容器(containers)有时候也被称为集合(collections),是能够在内存中存储其它特 ...

  6. Qt容器类之一:Qt的容器类介绍

    一.介绍 Qt库提供了一套通用的基于模板的容器类,可以用这些类存储指定类型的项.比如,你需要一个大小可变的QString的数组,则使用QVector<QString>. 这些容器类比STL ...

  7. QT5:先导篇 数据类型

    一.简介 二.字符串类(QString) 三.日期类(QData) 四.时间类(QTime) 五.顺序容器类 Qt的顺序容器类有QList QLinkedList  QVector QStack QQ ...

  8. Qt中的常用容器类(解释比较全面,有插图)

    在Qt库中为我们提供了一系列的基于模板的容器类.这些类可以被用来存储特定类型的项.例如,如果你需要一个大小可以变得QString数组,那么可以使用QVector<QString>. 这些容 ...

  9. Qt类库介绍

    QT类库 QT核心特点 QT是一个跨平台开发的类库. QT的元对象编译器MOC是一个预处理器,在源程序被编译前先将这些QT特性的程序转为标准的C++兼容的形式,然后再有标准的C++编译器进行编译.也就 ...

随机推荐

  1. PyQt5 signal and slot

    PyQt5 的 signal 与 slot 有所改变,例如,先定义一个 ZeroSignal 类: class ZeroSignal(QObject): atzero = pyqtSignal(int ...

  2. 生成并调用so动态库

    本文更新于2019-01-03. 生成库 头文件fn.h如下: #ifndef __FN_H__ #define __FN_H__ #ifdef __cplusplus extern "C& ...

  3. 记数据结构MOOC-二叉树

    主要的学习内容 在本章中,主要学习了二叉树的实现以及各种遍历的方法.着重介绍了前序.中序.后序三种遍历方法的递归实现,同时也描述了前序中序遍历的迭代方法. 教材的主要内容 教材是以哈夫曼编码树为主要脉 ...

  4. 201552-53 《Java程序设计》第五周问题汇总

    201552-53 <Java程序设计>第五周问题汇总 1.编译时,终端显示: 注:XXX.java使用了未经检查或不安全的操作,如何解决? 解答:并不是错误,可以忽视. 2.构造函数与类 ...

  5. 20145226夏艺华 Exp6 信息搜集与漏洞扫描

    20145226夏艺华 Exp6 信息搜集与漏洞扫描 基础问题回答 哪些组织负责DNS,IP的管理? · 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务器.DNS和IP地址管理 ...

  6. 【Windows10】我的电脑从新装到优化配置

    [Windows10]我的电脑从新装到优化配置 必装软件 Visual Studio Microsoft VS Code Microsoft Expression Design 4 Notepad2- ...

  7. 【整理总结】代码沉淀 - Caliburn.Micro - MV*模式短小精悍的框架

    Caliburn.Micro - Xaml made easy. web: https://github.com/Caliburn-Micro/Caliburn.Microdocument: http ...

  8. 变态的iis10

    IIS10发布网站不能使用.NET4.0需要重新注册在之前版本的系统中使用如下命令可以直接重新注册: 但是windowsServer2016(iis 10) 使用该命令 提示 版本不支持 C:\WIN ...

  9. 任务队列和异步接口的正确打开方式(.NET Core版本)

    任务队列和异步接口的正确打开方式 什么是异步接口? Asynchronous Operations Certain types of operations might require processi ...

  10. cogs2554 [福利]可持久化线段树

    cogs2554 [福利]可持久化线段树 原题链接 每次修改复制一遍就行了... 1A!!! // It is made by XZZ #include<cstdio> #include& ...