16.QT-QMap和QHash解析
他们的时间复杂度如下所示:
O(logn): 当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的)。二分查找就是O(logn)的算法,每找一次排除一半的可能,256个数据最坏情况是8次到目标。
O(n): 就代表数据量增大几倍,耗时也增大几倍。比如常见的遍历算法
O(1): 最低的时间复杂度,无论输入数据增大多少倍,耗时/耗空间都不变。 哈希算法就是典型的O(1)时间复杂度
QMap
- QMap原型为class QMap <K,T>,其中K表示键,T表示值,K和T属于映射关系.
- QMap会根据K来自动进行升序键排序
- QMap中的K类型必须重载operator <
QMap常用函数如下:
const Key QMap::key ( const T & value ); //通过值来找键,若未找到则返回0,由于只对K键进行排序,所以该函数不是快速查找 const T QMap::value ( const Key & key ); //通过键来查找值, 若未找到则返回0,由于K键已进行排序,所以属于快速查找
QMap示例:
QMap<QString, int> map; //定义键为QString型,值为int型 map["key 1"] = 3; map["key 1"] = 1; //更新key 1的值 map["key 4"] = 4; map["key 2"] = 2; map.insert("key 3", 3); //等价于: map["key 3"] = 3; QList<QString> list = map.keys(); for(int i=0;i<list.length();i++) { qDebug()<< list[i]<<","<< map.value(list[i]) ; }
打印:
"key 1" , 1 "key 2" , 2 "key 3" , 3 "key 4" , 4
也可以使用QMapIterator迭代器来遍历整个QMap
QMapIterator常用函数如下:
void toFront (); //使迭代器的游标指向容器的头部 void toBack (); //使迭代器的游标指向容器的尾部 Item next (); //返回map中的下一项,并使迭代器的游标指向下一项 Item previous (); //返回map中的上一项,并使迭代器的游标指向上一项 bool hasNext (); //若迭代器的游标指向的map还有下一项,则返回true,,若为空则返回false bool hasPrevious (); //若迭代器的游标指向的map还有上一项,则返回true,,若为空则返回false const Key & key (); //返回上一项的键(key)和数值(value); const T& value(); //返回上一项的数值(value);
示例:
QMap<QString, int> map; map["key 1"] = 3; map["key 1"] = 1; //key 1将会覆盖之前的key 1 map["key 4"] = 4; map["key 2"] = 2; map.insert("key 3", 3); QMapIterator<QString, int> it(map); while(it.hasNext()) { it.next(); qDebug()<<it.key()<<","<<it.value(); }
或者:
QMap<QString, int> map; //定义键为QString型,值为int型 map["key 1"] = 3; map["key 1"] = 1; //更新key 1的值 map["key 4"] = 4; map["key 2"] = 2; map.insert("key 3", 3); //等价于: map["key 3"] = 3; QMap<QString, int> ::iterator it = map.find("key 3"); if(it!=map.end()) { qDebug()<<it.key()<<it.value(); //打印key3 3 } it = map.begin(); while(it!=map.end()) { qDebug()<<it.key()<<it.value(); //遍历map ++it; }
在QMap类里也封装了一个 const_iterator 迭代类,也可以通过它来遍历整个QMap
示例如下:
QMap<QString, int> map; map["key 1"] = 3; map["key 1"] = 1; //key 1将会覆盖之前的key 1 map["key 4"] = 4; map["key 2"] = 2; map.insert("key 3", 3); QMap<QString, int>::const_iterator it; for(it = map.begin();it!=map.end();it++) { qDebug()<< it.key()<<","<<it.value(); }
QHash
- QHash原型为class QHash<K,T>,其中K表示键,T表示值,K和T属于映射关系.
- 和QMap不同的是,QHash中的键值对不会进行自动排序,而是更据Hash值存储
- QHash中的Key类型必须重载operator ==
- QHash中的Key对象必须重载全局哈希函数qHash()
- 由于QHash通过Hash表存储,所以查找比QMap快
QHash常用函数和QMap类似,示例如下:
QHash<QString, int> hash; hash["key 1"] = 3; hash["key 1"] = 1; //key 1将会覆盖之前的key 1 hash["key 4"] = 4; hash["key 2"] = 2; hash.insert("key 3", 3); QList<QString> list = hash.keys(); for(int i=0;i<list.length();i++) qDebug()<<list[i]<<","<<hash.value(list[i]);
运行打印:
"key 1" , 1 "key 2" , 2 "key 3" , 3 "key 4" , 4
QHash的迭代器QHashIterator类用法,和QMap的使用方法一样.
QHash内部也封装了一个 const_iterator 迭代类,和QMap的使用方法也一样,比如:
QHash<QString, int> hash; hash["key 1"] = 3; hash["key 1"] = 1; //key 1将会覆盖之前的key 1 hash["key 4"] = 4; hash["key 2"] = 2; hash.insert("key 3", 3); QHash<QString, int> ::const_iterator it; for(it=hash.begin();it!=hash.end();it++) qDebug()<<it.key()<<","<<it.value();
QMap和QHash区别
人间有真情,人间有真爱。