在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