QMap和QHash类区别,应用场景,优缺点

QMap和QHash是Qt框架中用于存储键值对的容器类,它们有以下区别、应用场景以及优缺点:

区别:

  1. 数据结构:QMap基于红黑树实现,保证元素有序;而QHash基于哈希表实现,没有固定顺序。
  2. 内存消耗:由于红黑树需要额外的内存来维护树结构,所以QMap相比QHash占用更多的内存。
  3. 查找效率:由于红黑树的特性,QMap在查找操作上具有较好的性能;而QHash通过哈希函数计算索引,查找速度通常更快。

两者时间复杂度比较

容器类

键查找

插入

平均

最坏

平均

最坏

QMap

O(log n)

O(log n)

O(log n)

O(log n)

QHash

Amort.O(1)

O(n)

Amort.O(1)

O(n)

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

  运行结果如下图:

应用场景:

  1. QMap适用于需要按照键排序或者进行范围查询的情况。例如字典、关联数组等。
  2. QHash适用于大量数据快速查找、插入和删除的情况。例如缓存、索引等。

优缺点:

QMap:

  1. 优点:提供了按照键排序的功能,支持范围查询,在某些场景下具有更好的性能;
  2. 缺点:相比QHash,占用更多内存空间,并且插入/删除操作可能略慢。

QHash:

  • 优点:在大部分情况下具有更好的查找、插入和删除性能,占用较少的内存;
  • 缺点:没有固定顺序,不支持范围查询。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(Qt实战项目视频教程+代码,C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

猜你喜欢

转载自blog.csdn.net/hw5230/article/details/134785905
今日推荐