QHash的使用(插入、取值、遍历、删除)
1——创建,键值对的方式插入,数据类型随意,这里以键int,值QString示例。
QHash qhash;
2——插入
//方式一 qhash[1] = "1"; qhash[2] = "2"; qhash[3] = "3"; //方式二 qhash.insert(4, “4”);
通常,QHash 每个键只允许有一个值。如果用已经存在的键调用 insert(),先前的值将被删除
qhash.insert(4,"10);
最后键为4的值将变成“10”。
3——取值;
//方式一QString str1=qhash.value(1);//str1="1"; //方式二 QString str2=qhash[2];//str1="2";
如果qhash里面没有该键值,则返回默认构造值;比如:QString str3=qhash.value(5);//str3="";
4——检索某个值是否在里面
if(qhash.contains(9)) { return false; } if(qhash.contains(1)) { return true; }
5——查找某个字并获取,一般推荐contains结合value重载函数来实现,
QString str; if(qhash.contains(1)) { str=qhash.value(1); } else { str=qhash.value(1,"wert"); //如果哈希表中不存在指定键的元素,该函数使用第2个参数作为默认值 }
而不是 operator 运算符查找哈希表中的键。原因是如果哈希表中不存在相同键的元素,operator 运算符会默默地将一个元素插入到哈希表中(除非哈希表是 const 的)
//错误for (int i = 0; i < 1000; ++i) { if (qhash[i] == "789") cout << "Found value at index " << i << Qt::endl;}
为了避免这个问题,将上面代码中的 hash[i]
替换为 hash.value(i),为什么这样可以,来我们来看看value的函数原型:const T value ( const Key & key ) const
;const啊姐妹!
6——遍历 QHash 中存储的所有键值对
QHash::const_iterator it = qhash.constBegin();while (it != qhash.constEnd()) { cout << it.key() << ": " << it.value() << Qt::endl; ++i;}
当然不用const_iterator也可以,直接iterator;
7——删除,下面两种都可以
qhash.erase(it);//这里的it是迭代器哦 qhash.remove(key);
QHash和QMap好像,我的天;但是它们两个还是有一定的区别的
- QHash 的查找速度比 qmap 快。
- 遍历 qmap 时,元素总是按照键的顺序排好序的。而遍历 QHash时,元素的顺序是任意的。
qt关联容器 | 关键字查找 | 插入 | ||
平均 | 最差 | 平均 | 最差 | |
QMap | O(log n) | O(log n) | O(log n) | O(log n) |
QHash | Amort. O(1) | O(n) | Amort. O(1) | O(n) |
注: Amort.O(1)表示仅完成一次操作,可能会有O(n)行为;但是如果完成多次操作,如n次,平均结果是O(1)