QT-QMap和QHash解析

QT-QMap和QHash解析

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