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 < () 函数。
    二者时间复杂度比较如下图:
    QT自学过程记录(7-2):QT5容器类 - QMap类和QHash类_QHash

4 QMap类

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

5 QHash类

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

6 Java风格迭代器遍历容器

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

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

#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;
}

  运行结果如下图:

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

7 STL风格迭代器遍历容器

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

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

#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;
}

  运行结果如下图:

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

8 总结


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