QT自学过程记录(7-2):QT5容器类 - QMap类和QHash类

1 目录及资源索引

  QT自学过程目录及资源索引

2 参考文章说明

  QT QMap介绍与使用

3 简介及时间复杂度比较

  QMap和QHash其实类似于C++中的Map和Hash类,只不过在QT中,加以封装。
  Map:Map是一个很有用的数据结构。它以“键-值”的形式保存数据。在使用的时候,通过提供字符标示(键)即可得到想要的数据。这个“数据”即可以是一个字符串,也可以是任意对象,当然也包括自己定义的类对象。说明:map是以值传递的形式保存数据的。
  Hash:QHash<K, T>是一个在哈希表中存储键值对的数据结构。它的接口几乎与QMap<K, T>相同,但是与QMap<K, T>相比,它对K的模板类型有不同的要求,而且它提供了比QMap<K, T>更快的查找功能。
  QMap类和QHash类具有非常类似的功能,差别如下:

  • QHash具有比QMap更快的查找速度;
  • QHash以任意的顺序存储数据项,而QMap总是按照键Key顺序存储数据;
  • QHash的键类型Key必须提供 operator == () 和一个全局的 qHash(Key) 函数,而QMap的键类型Key必须提供 operator < () 函数。
    二者时间复杂度比较如下图:
    在这里插入图片描述

4 QMap类

  QMap<Key, T>提供了一个从类型为Key的键到类型为T的值的映射。

5 QHash类

  QHash<Key, T>具有与QMap几乎完全相同的API。QHash维护着一张哈希表(Hash Table),哈希表的大小与QHash的数据项的数目相适应。

6 Java风格迭代器遍历容器

  对于每一个容器类,Qt都提供了两种类型的Java风格迭代器数据类型,即只读访问和读写访问,具体分类如下图:
在这里插入图片描述

#include <QDebug>
int main(int argc,char *argv[])
{
    QMap<QString, QString> map;                                         // 定义一个关联容器

    map.insert("beijing", "111");                                       // 添加内容 对应 键值 - 内容
    map.insert("shanghai", "021");
    map.insert("nanjing", "025");

    QMapIterator<QString,QString> i(map);                               // 为遍历容器定义变量

    for(;i.hasNext();)
        qDebug()<<"  "<<i.key()<<"  "<<i.next().value();

    QMutableMapIterator<QString,QString> mi(map);

    if(mi.findNext("111"))                                              // 按内容查找 查找到内容为 "111" 替换为 "010"
        mi.setValue("010");

    QMapIterator<QString,QString> modi(map);

    qDebug()<<"  ";
    for(;modi.hasNext();)
        qDebug()<<" "<<modi.key()<<"  "<<modi.next().value();

    return 0;
}

  运行结果如下图:
在这里插入图片描述

7 STL风格迭代器遍历容器

  对于每一个容器类,Qt都提供了两种类型的STL风格迭代器数据类型,即只读访问和读写访问,具体分类如下图:
在这里插入图片描述

#include <QDebug>
int main(int argc,char *argv[])
{
    QMap<QString,QString> map;

    map.insert("beijing", "111");
    map.insert("shanghai", "021");
    map.insert("nanjing", "025");

    QMap<QString,QString>::const_iterator i;                // 遍历 打印一遍原始信息
    for(i=map.constBegin();i!=map.constEnd();++i)
        qDebug()<<"  "<<i.key()<<"  "<<i.value();

    QMap<QString,QString>::iterator mi;                     // 查找 按键值进行查找 替换键值为beijing的内容
    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;
}

  运行结果如下图:
在这里插入图片描述

8 总结

  1. STL:C++标准模板库;
  2. 一个按照内容查找,一个按照键值查找。
  3. 程序理解不是很深入,只是知道大概意思,需加强。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FightingBoom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值