QHash <Key,T>是Qt的通用容器类之一。它存储(键,值)对,并提供与键关联的值的快速查找。
1,QHash提供与QMap非常相似的功能。
不同之处在于:
(1)QHash提供比QMap更快的查找,但所需空间更大。
(2)QMap默认按照键值升序排序;。使用QHash按照键值任意排序。
(3)QMap的键类型必须提供operator <()。QHash的键类型必须提供operator ==()和称为qHash()的全局哈希函数。
2,一个QHash每个键只允许一个值。
如果使用QHash中已存在的键调用insert(),则先前的值将被删除,如:
hash.insert("plenty", 100);
hash.insert("plenty", 2000);
// hash.value("plenty") == 2000
3,如果只需要从哈希中提取值(而不是键),则也可以使用foreach:
QHash<QString, int> hash;
...
foreach (int value, hash)
cout << value << Qt::endl;
Qt进入foreach循环时会自动获取容器的副本,如果在迭代时修改容器,则不会影响循环(如果不修改容器,则仍会进行复制,但是由于隐式共享,复制容器非常快)。由于foreach会创建容器的副本,因此对变量使用非常量引用将不允许您修改原始容器,它只会影响副本。
Qt foreach循环的替代方法for是C ++ 11和更高版本中的基于范围的。但是,基于范围的for可能会强制Qt容器分离,而foreach不会。使用foreachAlways复制容器,对于STL容器通常并不容易。建议使用foreach Qt容器,并使用基于范围的forSTL 容器。
4,qHash()函数
QHash的键类型除了是可分配的数据类型外,还具有其他要求:它必须提供operator ==(),并且该类型的名称空间中还必须有一个qHash()函数,该函数返回键类型的参数的哈希值。该qHash()函数计算基于密钥的数值。只要给定相同的参数,它总是返回相同的值,它就可以使用任何可以想象的算法。换句话说,如果e1 == e2,则qHash(e1) == qHash(e2)也必须成立。但是&#