Qt学习之路25--QMap和QHash

在C++标准库中是有map容器的概念。

QMap

  • QMap是一个以升序键顺序存储键值对的数据结构
  • QMap原型为class QMap<key, value>
  • QMap中根据键值key进行的升序排序
  • QMap中key的类型必须要重载operator <操作符
  • QMap提供了一个从类项为key的键到类项为value的值的映射,通常所存储的数据类型是一个键对应一个值
  • 同时也支持一键多值的情况,用类QMultiMap可以实现。
  • 键值对都可以是任意类型
  • 可以定义迭代器指向每个键值对元素,可以理解成一个指针
  • 通过key获取value时:
    • 当key存在:返回对应的value
    • 当key不存在:返回value类型对应的“零值”
  • 插入键值对时:
    • 当key存在:更新value的值
    • 当key不存在:插入新的键值对

QHash

  • QHash是Qt中的哈希数据结构
  • QHash原型为class QHash<key, value>
  • QHash的键值对在内部无序排列
  • QHash中的key类型必须重载operator ==操作符
  • QHash中的key对象必须重载全局的qHash()函数
  • 此类维护一张哈希表,表的大小和数据项是自适应的
  • QHash是以任意的顺序存储的数据
  • 也是可以支持一键多值的,用类QMultiHash可以实现。
  • 键值对都可以是任意类型
  • QMap和QHash的接口相同,可直接替换使用
  • 可以很方便的根据设置的键来获取对应的值,查找效率高于QMap。
  • 迭代器it可以理解成一个指针,可以指向QMap对象的每个元素

哈希函数

  • 哈希函数是一个散列函数,其作用就是为了打乱输入规律
  • 哈希函数的输入域无穷,输出域(S域)有限
  • 通过哈希函数处理后,一个输入对应一个确定的输出
  • 存在哈希碰撞,即多个输入可能得到同一个输出
  • 由于输入域无穷,输出域有限,所以当有很多个不同输入时,得到的输出结果是均匀排布的
  • 哈希函数的输出值与输入规律无关
  • 输出域(S域)是均匀分布的,当对输出域每个值进行同一个值的模运算后其结果仍然均匀分布
  • 哈希表经典结构是数组加链表,比如数组大小为M,在对插入多个键值对进行哈希函数计算得到相当多的code码,执行code%M后所有的结果就会分布在0~M-1的位置,当发生哈希碰撞时就将重复的key值对应的value值使用链表将其挂接起来,每个位置后面挂接的链表的长度都是基本均匀的
  • 当需要扩容时根据扩大容量的倍数来决定复杂度,比如每次扩大2倍就是log2(N),但是现在存在各种优化方法,可以使得增删改查的复杂度都为O(1)

两者区别

  • QHash的查找速度明显快于QMap
    • 因为QHash的排布是通过调用qhash
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值