`
qimo601
  • 浏览: 3445127 次
  • 性别: 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之QMap的使用分析

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

    自定义key值

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

    数据结构大作业:基于QT的家谱管理系统.zip

    QList用于链表,QMap和QHash则可以用于实现键值对映射,类似于树或图的节点和边的关系。这些容器类提供了丰富的操作方法,使得数据的增删改查变得简单易行。 在设计数据库接口时,QT提供了QSqlDatabase模块,可以...

    Qt之QHash的使用分析

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

    QT/C++ 一次性读取指定基本格式下的配置文件(.ini)的全部类型的所需键值对

    接着,定义一个函数,接收配置文件路径和一组预定义的键名作为参数,返回一个映射结构,如QMap或QHash,来保存键值对: ```cpp QMap, QString&gt; readConfig(const QString &filePath, const QStringList &keyList) ``...

    《嵌入式Qt开发项目教程》源码

    此外,可能还会使用到QMap或QHash来存储和检索地理坐标信息。 GPRS短信程序(QTSMSApp)则涵盖了网络通信和短信服务。在嵌入式环境中,这通常需要使用Qt的QNetworkAccessManager和QNetworkReply类来实现HTTP请求和...

    Qt诺基亚官方中文教程

    在"Qt诺基亚官方中文教程L3_Qt的数据类型机会及文件.ppt"中,你将学习到Qt如何处理各种数据类型,包括基本类型、容器类(如QList、QVector)和高级数据结构(如QMap、QHash)。此外,Qt还提供了强大的文件和I/O操作...

    Qt程序,将三沙市的GeoJson格式数据转化为mif文件

    这些信息可以存储在QMap或QHash中,键为属性名,值为属性值。 4. **生成MIF文件**:MIF文件没有内置的Qt支持,所以你需要自己定义格式来写入文件。MIF文件由头部信息、几何数据和属性数据组成。你需要根据MIF格式...

    QT学习之路

    - **容器类**:了解Qt提供的各种容器类,如顺序存储容器(QList, QQueue等)、关联存储容器(QMap, QHash等)及其遍历器和隐式数据共享机制。 - **Model-View架构**:这是一种设计模式,可以分离数据管理和视图展示,Qt...

    其实这本PDF就是Qt学习之路第一版

    - **关联存储容器**: 包括 QMap, QHash 等。 - **特点**: 基于键值对存储数据,提供高效的数据检索。 - **遍历器与隐式数据共享**: 提高容器类的使用效率和性能优化策略。 #### 七、Model-View架构 - **概念**: ...

    Dictionary-Impl.-With-Template-in-Qt-C-:您可以通过以下方式访问该文章

    在Qt框架中,我们通常会使用QMap、QHash等容器来存储键值对数据。这些容器已经提供了查找、插入、删除等操作,且支持迭代器,非常方便。然而,如果我们需要更高级的功能,或者特定的性能优化,可能会选择自定义数据...

    Qt 精通数据库编程

    - `QMap`和`QHash`是关联容器,用于存储键值对。`QMap`基于红黑树实现,保证了插入和查找的O(log n)效率,而`QHash`使用哈希表,提供了更快的平均查找速度。 - **QString**: `QString`是Qt中的字符串类,它提供...

    Qt_chapter5.zip

    这些容器包括QList、QVector、QStringList、QHash、QMap等。QList和QVector是基于动态数组的容器,适用于快速的随机访问和插入删除操作;QStringList则专门用于字符串操作;而QHash和QMap则是基于哈希表和红黑树的...

    qt4中文教程学习笔记

    - **关联容器(QMap、QHash)** - 分别提供了基于键值对映射的容器。 - **泛型演算(Generic Algorithms)** - 提供了一系列通用算法,如排序、查找等。 **6.2 文件处理** - **QFile** - 用于文件操作的类,...

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

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

    Qt开发面试题.pdf

    - **QMap/QHash:** 键值对存储,前者提供有序存储。 14. **XML和JSON解析**: - **QDom/QXmlStreamReader/QJsonDocument/QJsonObject/QJsonArray:** 提供解析工具。 15. **QtQuick与Qt Widgets的性能考量与...

    c++ qt 笔记 qt 笔记

    - `QMultiMap`: 与 `QMap` 类似,但允许多个值与相同的键关联。 - `QHash`: 哈希表,用于高效查找。 - `QMultiHash`: 类似于 `QHash`,但允许多个值与相同的键关联。 - `QSet`: 存储唯一值的集合。 ### 六、Qt 类库...

Global site tag (gtag.js) - Google Analytics