QT容器类(三) 之 QMap、QHash

(一)介绍

QMap

QMap中的key-value对是升序排列的

插入和删除操作中都可以使用[]运算符,其下标为key;为避免创建不必要的空值,推荐用vlaue()而不是[]从QMap中取值。

QMap<K,T>中的K和T除了要求具备默认构造函数、拷贝构造函数和赋值运算符外,K还必须支持operator <,因为这样才能实现前面提到的升序排列。

keys() & values()

QMap的特性是单值;QMultiMap<K,T>则支持同一关键字下多值的存在,插入操作由insertMulti()完成


QHash
QHash提供的接口和QMap很相似
QHash<K,T>中的K要符合的额外要求:支持operator ==,并且K可用全局函数qHash()来计算hash value

QHash通常是单值的,而QMultiHash则通过insertMulti()支持多值插入。

(二)对比

QMap提供了一个从类项为key的键到类项为T的直的映射,通常所存储的数据类型是一个键对应一个直,并且按照Key的次序存储数据,这个类也支持一键多值的情况,用类QMultiMap

QHash具有和QMap几乎完全一样的APi,此类维护这一张哈希表,表的大小和数据项是自适应的,QHash是以任意的顺序住址他的数据,,当然了他也是可以支持一键多值的,QMultiHash

两种之间的区别是:

QHash查找速度上显著于QMap

QHash以任意的方式进行存储,而QMap则是以key顺序进行存储.

Qhash 的键类型必须提供operator==()和yige 全局的qHash(key)函数。而QMap的键类型key必须提供operator<()函数.


(三)例子

QMap

  1. #include <QDebug> 
  2. int main(int argc, char *argv[])  
  3. {  
  4.     QMap<QString, QString> map;  
  5.     map.insert("beijing", "111");  
  6.     map.insert("shanghai", "021");  
  7.     map.insert("tianjin", "022");  
  8.     map.insert("chongqing", "023");  
  9.     map.insert("jinan", "0531");  
  10.     map.insert("wuhan", "027");     
  11. QMap<QString, QString>::const_iterator i;  
  12.     for( i=map.constBegin(); i!=map.constEnd(); ++i)  
  13.         qDebug() << i.key() <<"        " << i.value();     
  14.        
  15.     QMap<QString, QString>::iterator mi;  
  16.     mi = map.find("beijing");  
  17.     if(mi != map.end())  
  18.         mi.value() = "010";  
  19.     QMap<QString, QString>::const_iterator modi;  
  20.     qDebug() << "";  
  21.     for( modi=map.constBegin(); modi!=map.constEnd(); ++modi)  
  22.         qDebug() << modi.key() <<"        " << modi.value();     
  23.     return 0;  


QHash:

#include <QCoreApplication>
#include<QHash>
#include<QDebug>
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
QHash<QString, QString> hash;
hash.insert("beijing", "010");
hash.insert("wuhan", "027");
hash.insert("tianjin", "022");
QHash<QString, QString>::const_iterator i;
for(i=hash.constBegin();i!=hash.constEnd();i++)
{
    qDebug()<<i.key()<<"   "<<i.value()<<endl;
}
 
 
QHash<QString, QString>::iterator j;
j = hash.find("wuhan");
if(j != hash.end())
{
    j.value() = "002700";
}
QHash<QString, QString>::const_iterator k;
for(k=hash.constBegin();k!=hash.constEnd();k++)
{
    qDebug()<<k.key()<<"   "<<k.value()<<endl;
}
 
 
    return a.exec();
}
 
 


  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值