除了对存储在容器类中的所有值类型的一般要求,QHash<K, T>中K的值类型还需要提供一个operator==(),并需要一个能够为键返回哈希值的全局qHash()函数的支持。 Qt已经为qHash()函数提供了对整型、指针型、QChar、QString以及QByteArray。 在内部,它们都依赖于QHash<K, T>,且都像QHash<K, T>一样对K的类型有相同的要求。 最简便的遍历存储在关联容器中多有键值对的方式是使用Java风格的迭代器。 几乎完全一样的APi,此类维护这一张哈希表,表的大小和数据项是自适应的,QHash是以任意的顺序住址他的数据,,当然了他也是可以支持一键多值的,QMultiHash 两种之间的区别是: QHash查找速度上显著于 QMap QHash以任意的方式进行存储,而QMap则是以key顺序进行存储 Qhash 的键类型必须提供operator==()和一个全局的qHash(key)函数。
本文翻译自: https://woboq.com/blog/qmap_qhash_benchmark.html 作者: Olivier Goffart 在我的Qt开发者日2012演示文稿(深入探讨QtCore )时,我做了一个比较QMap和QHash的基准。 在底层实现上 在Qt 4中QHash使用哈希表实现,而QMap使用跳跃表实现。 在Qt 5中,虽然容器的实现有所改变,但概念仍然相同。 对于QHash,人们应该期望它不随元素数量而变化,对于QMap,它应该是O(log N): 对数刻度上的直线。 Qt 4.8 ? QMap的执行稍微慢于std::map。 对于少于10个元素,QMap查找比QHash更快。 Qt 5 ? 将跳跃表更改为红黑树是一个好主意。与STL相比,Qt容器的性能基本相同。如果少于20个元素,QMap比QHash更快。
=map.end();it++) { qDebug()<< it.key()<<","<<it.value(); } QHash QHash原型为class QHash<K,T>,其中K表示键 和QMap不同的是,QHash中的键值对不会进行自动排序,而是更据Hash值存储 QHash中的Key类型必须重载operator == QHash中的Key对象必须重载全局哈希函数qHash() 由于 QHash通过Hash表存储,所以查找比QMap快 QHash常用函数和QMap类似,示例如下: QHash<QString, int> hash; hash["key 1"] = 3; hash[" QHash内部也封装了一个 const_iterator 迭代类,和QMap的使用方法也一样,比如: QHash<QString, int> hash; hash[" =hash.end();it++) qDebug()<<it.key()<<","<<it.value(); QMap和QHash区别 ?
类 无序的map字典 //QHash<key>具有与QMap几乎完全相同的API,QHash维护的是一张hash表,哈希表的大小与QHash的数据项的数目相适应 //QHash以任意的顺序组织它的数据 ; QHash<QString, int> qhash; qhash["key 1"] = 3; qhash["key 2"] = 8; qhash["key 3"] = 4; qhash["key 4"] = 2; qhash.insert("key 3",90); QList<QString> list = qhash.keys(); for(int i "---------------------QHASH-----------------------"; //QHash内部的迭代器类QHashIterator类 QHash<QString 与QHash的区别 -----------// //1.QHash与QMap功能差不多,但是QHash的查找速度更快 //2.QMap是有序的,按key的顺序存储数据;QHash是无序的
QMap提供了一个从类项为key的键到类项为T的直的映射,通常所存储的数据类型是一个键对应一个直,并且按照Key的次序存储数据,这个类也支持一键多值的情况,用类QMultiMap QHash具有和QMap 几乎完全一样的APi,此类维护这一张哈希表,表的大小和数据项是自适应的,QHash是以任意的顺序住址他的数据,,当然了他也是可以支持一键多值的,QMultiHash 两种之间的区别是: QHash查找速度上显著于 QMap QHash以任意的方式进行存储,而QMap则是以key顺序进行存储. Qhash 的键类型必须提供operator==()和yige 全局的qHash(key)函数。而QMap的键类型key必须提供operator<()函数. 他们同样也是有两种风格的迭代容器。 ///QMap<Key,T(value)> and QHash<K,T>#include <QtCore/QCoreApplication>#include <qmap.h>#include <qdebug.h
,QString> &data,QString sqlWhere=""); //获取数据 bool getData(QString dbName,QString table,QList<QHash addData(QString dbName,QString tableName,QHash<QString,QString> data);//增加 bool delData(QString <QString,QString>> &data);//执行sql语句,并获取结果 bool getData(QString tableName,QHash<QString,QString> & data,QString sqlWhere=""); //获取数据 bool getData(QString table,QList<QHash<QString,QString>> &data, <QHash<QString,QString>> &data,QString sqlWhere=""); //获取数据 bool addData(QString tableName,QHash<
QHash 是一个无序的关联容器,它存储键值对,但与 QMap 不同,QHash 不会对键进行排序。 isEmpty() const 判断 QHash 是否为空。 size() const 返回 QHash 中键值对的数量。 clear() 清空 QHash 中的所有元素。 keys() const 返回 QHash 中所有键的列表。 values() const 返回 QHash 中所有值的列表。 begin() 返回指向 QHash 开始位置的迭代器。 unite(const QHash &other) 合并两个 QHash,将 other 中的元素合并到当前 QHash。 intersect(const QHash &other) 保留两个 QHash 中共有的元素,删除其他元素。
QMap类和QHash类 QMap类和QHash类具有很类似的功能。它们的区别仅在于: QHash具有比QMap更快的查找速度。 QHash以随意的顺序存储数据项。 QHash的键类型Key必须提供operator==()和一个全局的qHash(Key)函数,而QMap的键类型Key必须提供operator<()函数。 1 . 2.QHash类 QHash<Key,T>具有和QMap差点儿全然同样的API。 QHash维护着一张哈希表(hash table)。 哈希表的大 小和QHash的数据项的数目相适应。 3. STL风格的迭代器容器遍历 对于每个容器类。Qt都提供了两种类型的STL风格迭代器数据类型:一种提供仅仅读訪问。
底层实现 红黑树(自平衡二叉搜索树) 排序方式 按键(Key)自动升序排序(可通过自定义比较函数修改) 查找效率 O(log n) 键值对存储 键(Key)唯一,值(Value)可重复 内存占用 略高于 QHash 对比其他容器 容器 底层结构 排序 查找效率 内存占用 适用场景 QMap 红黑树 有序 O(log n) 较高 需要有序遍历或自定义排序 QHash 哈希表 无序 O(1) 较低 高频插入/删除,无需排序 性能优化建议 优先用 QHash:若不需要排序,QHash 的查找更快。 预分配空间:对于已知大小的数据,可用 reserve()(但实际优化效果有限,因树结构动态增长)。 典型应用场景 配置管理:存储键值配置项(如 QMap<QString, QVariant>) 字典/索引:有序数据查询(如单词词典) 缓存系统:需快速查找的缓存数据(若无需排序,改用 QHash) 通过合理选择
<Key,T>,QMultiHash<Key,T> QHash::const_iterator QHash::iterator QList<int> list; list<<1<<2<<3<<4<<5 QMap 和 QHash 提供非常相似的功能。 区别在于: QHash 提供比 QMap 更快的平均查找速度。 在迭代 QHash 时,项目是任意排序的。 使用 QMap,项目总是按键排序。 QHash 的键类型必须提供 operator==() 和全局 qHash(Key) 函数。 QMap 的键类型必须提供 operator<() 指定总顺序。 ::iterator erase(QHash::const_iterator pos) QHash::iterator erase(QHash::iterator pos) QPair<QHash ::iterator, QHash::iterator> equal_range(const Key &key) QPair<QHash::const_iterator, QHash::const_iterator
QMap和 QHash是很相似的,不同的地方是: QHash的查找速度比QMap要快很多。 在对QHash进行迭代时,这些项是任意排序的。在QMap中,项总是按键排序。 QHash的关键类型必须提供运算符==()和全局QHash(key)函数。QMap的关键类型必须提供操作符<(),以指定全序顺序。
{ it_srw.setValue("星期一"); } } qDebug()<<vStarts; ---- QMap QMap与QHash 差别: QHash比QMap查找速度更快。 QHash以任意顺序存储,QMap以key顺序存储数据。 QHash的key必须提供operator==()及一个全局的qHash(key)函数,而QMap必须提供operator<()函数。 <<":"<<it_r1.next().value(); //这个迭代器看起来比较变扭,先拿key,然后通过下一个迭代点拿value } qDebug()<<wMap1; ---- QHash //QHash类 QHash<int,QString>moneyHash; moneyHash.insert(1,"一块钱"); moneyHash.insert(10,"十块钱
(可用于Qml使用) */ QHash<int, QByteArray> roleNames() const { QHash<int, QByteArray> roles
parent = nullptr); QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE; QHash arg(time/60).arg(time%60,2,10,QChar('0')); } return sqlRecord.value(role - Qt::UserRole); } QHash <int, QByteArray> LocalMusicModel::roleNames() const { QHash<int, QByteArray> names; names[Qt database: %s", qPrintable(query.lastError().text())); } qDebug() << "clear table ok"; } 重点是 QHash
on_cb_1_currentIndexChanged:"<<arg1; QFuture<void> future = QtConcurrent::run([&](){ QList<QHash ->tb->append("on_cb_1_clicked"); QFuture<void> future = QtConcurrent::run([&](){ QList<QHash currentIndexChanged:"<<arg1; QFuture<void> future = QtConcurrent::run([&,arg1](){ QList<QHash ->tb->append("on_cb_1_clicked"); QFuture<void> future = QtConcurrent::run([&](){ QList<QHash
QModelIndex()) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; QHash m_readers.at(index.row())->record(); default: return QVariant(); } return QVariant(); } QHash <int, QByteArray> ReaderModel::roleNames() const { static const QHash<int, QByteArray> roles{
dynamicwidget.h头文件如下图所示: #ifndef DYNAMICWIDGET_H #define DYNAMICWIDGET_H #include <QMainWindow> #include <QHash void onRemoveWidget(); private: Ui::DynamicWidget *ui; QHash<QPushButton*, QHBoxLayout*> mButtonToLayoutMap
数据处理优化:选择合适的容器类: 根据数据访问模式选择合适的 QT 容器类,例如 QVector、QList、QHash 等。 QVector 适合随机访问,QList 适合插入和删除操作,QHash 适合快速查找。避免不必要的拷贝: 使用引用或指针传递数据,而不是进行值拷贝。使用缓存: 对一些计算结果进行缓存,避免重复计算。
ref.uname.toStdString().data() << std::endl; } return a.exec(); } 关联容器 关联容器: qmap,qmultimap,qhash ,qmultihash,qmultihash,qset qmap/qmultimap: 提供了一个字典类型的关联数组,一个键映射一个值,qmap是按照顺序存储的,如果不在意顺序可以使用qhash,使用qhash { std::cout << ref.at(x).toStdString().data() << std::endl; } return a.exec(); } qhash 使用上与qmap相同,但qhash效率更高,唯一的不同时qhash不排序,qmap自动排序. qset: qset 集合容器,是基于散列表的集合模板,存储顺序不定,查找速度最快,内部使用qhash实现。
<PointData> DataPoint001;QList<LineData> DataLine001;QList<FaceData> DataFace001;// 预处理:构建点到线、点到面的映射QHash <int, QList<int>> pointToLinesMap;QHash<int, QList<int>> pointToFacesMap;// 预处理线数据for (const LineData