QMap和QHash是Qt框架中用于存储键值对的容器类,它们有以下区别、应用场景以及优缺点:
区别:
- 数据结构:QMap基于红黑树实现,保证元素有序;而QHash基于哈希表实现,没有固定顺序。
- 内存消耗:由于红黑树需要额外的内存来维护树结构,所以QMap相比QHash占用更多的内存。
- 查找效率:由于红黑树的特性,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;
}
运行结果如下图:
应用场景:
- QMap适用于需要按照键排序或者进行范围查询的情况。例如字典、关联数组等。
- QHash适用于大量数据快速查找、插入和删除的情况。例如缓存、索引等。
优缺点:
QMap:
- 优点:提供了按照键排序的功能,支持范围查询,在某些场景下具有更好的性能;
- 缺点:相比QHash,占用更多内存空间,并且插入/删除操作可能略慢。
QHash:
- 优点:在大部分情况下具有更好的查找、插入和删除性能,占用较少的内存;
- 缺点:没有固定顺序,不支持范围查询。
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(Qt实战项目视频教程+代码,C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓