`
qimo601
  • 浏览: 3416242 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

QMap与QHash

    博客分类:
  • Qt
阅读更多


转载:http://newfaction.net/2010/11/17/qt-qhash-and-qmap-difference.html



关联容器可以保存任意多个具有相同类型的项,且它们由一个键索引。Qt提供两个主要的关联容器类:QMap<K, T>QHash<K, T>

     QMap<K, T>是一个以升序键顺序存储键值对的数据结构。这种排列使它可以提供良好的查找插入性能及键序的迭代。在内部,QMap<K, T>是作为一个跳越列表(skip-list)来实现执行的。

     在映射中插入项的一种简单方式是调用insert():

QMap<QString, int> map;

map.insert("eins", 1);

map.insert("sieben", 7);

map.insert("dreiundzwanzig", 23);

另外,也可以像下面一样,给一个指定的键赋值:

map["eins"] = 1;

map["sieben"] = 7;

map["dreiundzwanzig"] = 23;

    []操作符即可以用于插入也可以用于检索。如果在非常量映射中使用[]为一个不存在的键检索值,则会用给定的键和空值创建一个新的项。为了避免意外的创建空值,可以使用value()函数代替[]操作符来获得项。

int val = map.value("dreiundzwanzig")

    如果键不存在,则利用值类型的默认构造函数,将返回一个默认值,同时不会创建新的项。对于基本类型和指针类型,将返回0值。我们可以指定另一默认值作为value()的第二个参数,例如:

int seconds = map.value("delay", 30);

这相当于:

int seconds = 30;

if (map.contains("delay");

    seconds = map.value("delay");

    QMap<K, T>的K和T数据类型可以是与int、double、指针类型、有默认构造函数的类、复制构造函数和赋值操作符相似的基本数据类型。此外,K类型必须提供operator<(),因为QMap<K, T>要使用这个操作符以提升键序顺序存储项。

    QMap<K, T>的K和T有一对方便的函数keys()和values(),它们在处理小数据集时显的特别有用。它们分别返回映射键的QList和映射值的QList。

映射通常都是单一值的:如果赋予一个现有的键一个新值,则原有的旧值将被该新值取代,以确保两个项不会共有同一个键。通过使用insertMulti()函数或者QMlltiMap<K, T>方便的子类,可以让多个键值对有相同的键。QMap<K, T>重载了value(const K &), 返回一个给定键多有值的QList列表。例如:

QMultiMap<int, QString> multiMap;

multiMap.insert(1, "one");

multiMap.insert(1, "eins");

multiMap.insert(1, "uno");

QList<QString> vals = multiMap.values(1);

    QHash<K, T>是一个在哈希表中存储键值对的数据结构。它的接口几乎与QMap<K, T>相同,但是与QMap<K, T>相比,它对K的模板类型有不同的要求,而且它提供了比QMap<K, T>更快的查找功能。

    除了对存储在容器类中的所有值类型的一般要求,QHash<K, T>中K的值类型还需要提供一个operator==(),并需要一个能够为键返回哈希值的全局qHash()函数的支持。Qt已经为qHash()函数提供了对整型、指针型、QChar、QString以及QByteArray。

    QHash<K, T>为它内部的哈希表自动分配最初的存储区域,并在有项被插入或者删除时重新划分所分配的存储区域的大小。也可以通过调用reserve()或者squeeze()来指定或者压缩希望存储到哈希表中的项的数目,以进行性能调整。通常的做法是利用我们预期的最大的项的数目来条用reserve(),然后插入数据,最后如果有多出的项,则调用squeeze()以使内存的使用减到最小。

    虽然哈希表通常都是单一值的,但是使用insertMulti()函数或者MultiHash<K, T>方便的子类,也可以将多个值赋给同一个键。

    除了QHash<K, T>之外,Qt还提供了一个用来高速缓存与键相关联的对象的QCache<K, T>类以及仅仅存储键的QSet<K>容器。在内部,它们都依赖于QHash<K, T>,且都像QHash<K, T>一样对K的类型有相同的要求。

    最简便的遍历存储在关联容器中多有键值对的方式是使用Java风格的迭代器。因为迭代器必须能同时访问键和值,针对关联容器的Java风格的迭代器与连续容器的在运作方式有些差异。只要区别在于next()和previous()函数返回一个代表键值对的对象,而不是一个简单的值。我们可以使用key()和value()分别从这个对象中获得键和值。例如:

QMap<QString, int> map;

...

int sum = 0;

QMapIterator<QString, int> i(map);

while (i.hasNext())

    sum += i.next().value();

    如果需要同时存取键和值,可以先忽略next()或previous()的返回值并使用迭代器的key()和value()函数,它们都是针对最后被跳过的项进行操作的:

QMapIterator<QString, int> i(map);

while(i.hasNext()){

    i.next();

    if (i.value() > largestValue){

        largestKey = i.key();

        largestValue = i.value();

    }

}   


===========================================================================================

原文链接:http://newfaction.net/2010/11/17/qt-qhash-and-qmap-difference.html

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

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

两种之间的区别是:
QHash查找速度上显著于QMap
QHash以任意的方式进行存储,而QMap则是以key顺序进行存储
Qhash 的键类型必须提供operator==()和一个全局的qHash(key)函数。而QMap的键类型key必须提供operator<()函数

他们同样也是有两种风格的迭代容器。用来进行遍历的。。
STL 风格的

QMap<key,T>  QMap<key,T>::const_iterator QMap<key,T>::iterator//同样中间那个也是只读的,最后那个是读写的。

下面以一个例子来进行说明:

#include <QDebug>

int main(int argc, char *argv[])
{
    QMap<QString, QString> map;
    map.insert("beijing""111");
    map.insert("shanghai""021");
    map.insert("tianjin""022");
    map.insert("chongqing""023");
    map.insert("jinan""0531");
    map.insert("wuhan""027");   

QMap<QString, QString>::const_iterator i;
    for( i=map.constBegin(); i!=map.constEnd(); ++i)
        qDebug() << i.key() <<"        " << i.value();   
       
    QMap<QString, QString>::iterator mi;
    mi = map.find("beijing");
    if(mi != map.end())
        mi.value() = "010";
    QMap<QString, QString>::const_iterator modi;
    qDebug() << "";
    for( modi=map.constBegin(); modi!=map.constEnd(); ++modi)
        qDebug() << modi.key() <<"        " << modi.value();   
    return 0;
}

 

分享到:
评论

相关推荐

    Qt 精通数据库编程

    式数据库 310 12.3.2 使用Oracle数据库 313 12.4 小结 325 第13章 Qt的模板库和工具类 326 13.1 Qt容器类 326 13.1.1 QList. QLinkedList和QVector 327 13.1.2 QMap. QHash 332 13.2 QString 334

    Qt之QMap的使用分析

    5.保证无毒 1.简单,方便,实用 3.实例可以自行改用 1.如有非法,本人无法律责任! 8.更多作品,查找标签“朱建强”7.... 4.如需联系我请看左边数字!1.如不知代表何物,那就放弃计算机吧! 0....CSDN老板不让我上传联系方式。

    自定义key值

    很多时候,我们使用双重map或者hash去处理缓冲区,但是key不够直观,本文,自定义key,解决多重map或者hash的key值问题。文中,使用Qmutimap进行测试,对mutilmap用法不熟悉的同学,可以学习一下,mutimap的用法。

    Qt之QHash的使用分析

    5.保证无毒 1.简单,方便,实用 3.实例可以自行改用 1.如有非法,本人无法律责任! 8.更多作品,查找标签“朱建强”7.... 4.如需联系我请看左边数字!1.如不知代表何物,那就放弃计算机吧! 0....CSDN老板不让我上传联系方式。

    福优林@Qt5小白变大牛初级篇word---第4章.pdf

    除了序列式容器,Qt中还提供了关联式容器:QMap,QMultiMap,QHash,QMultiHash,QSet。这些容器中存储的都是key-value对。其中,"Multi"容器又支持一个key可以关联多个value。"Hash"容器通过使用一个hash函数而不是...

    基于Qt开发的一款桌面端天气预报应用和音乐播放器源码

    通过调⽤⽹络IP地址查询获取当前位置城市,调⽤和⻛天⽓城市搜索API获取该城市的ID,根据ID调⽤和⻛实时天⽓API获取该城市天⽓,使⽤QMap容器存储多⽇天⽓数据。程序中可搜索城市名或者点击定位按钮查询城市近期天⽓,...

    精通Qt4编程(第二版)源代码

    \13.1.2 QMap、QHash 332 \13.2 QString 334 \13.2.1 隐式共享 335 \13.2.2 内存分配策略 336 \13.2.3 操作字符串 336 \13.2.4 查询字符串数据 337 \13.2.5 字符串的转换 338 \13.3 QVariant 339 \13.4 Qt的...

    精通qt4编程(源代码)

    \13.1.2 QMap、QHash 332 \13.2 QString 334 \13.2.1 隐式共享 335 \13.2.2 内存分配策略 336 \13.2.3 操作字符串 336 \13.2.4 查询字符串数据 337 \13.2.5 字符串的转换 338 \13.3 QVariant 339 \13.4 Qt的算法 341...

    QTon:QTon(Qt对象表示法)-json containerencoderdecoder

    请参阅此处以获取更多信息: : ##公共变量: bool ##公共职能: QStringList QList &lt;QVariant&gt; QPair &lt;QString&gt; QString QVariant值(QString键) QString toString() QMap &lt;QString&gt; toMap() QHash &lt;QString&gt; ...

Global site tag (gtag.js) - Google Analytics