首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在XML库中,为什么qt使用qhash而不是QMap来存储qtXml元素属性?

在XML库中,为什么qt使用qhash而不是QMap来存储qtXml元素属性?
EN

Stack Overflow用户
提问于 2021-10-28 09:52:55
回答 1查看 42关注 0票数 1

我正在使用qtxml编写xml文件,我发现每次运行我的程序时,输出xml文件的元素属性都有不同的顺序。

我阅读了源代码,发现qtxml使用QHash来存储元素属性,这将导致每次运行我的程序时,输出的XML文件的元素属性具有不同的顺序。

为什么不使用QMap来存储元素的属性呢?这将产生一个有序属性。

在这种情况下,QHashQMap有什么不同?

EN

回答 1

Stack Overflow用户

发布于 2021-10-29 17:37:36

QMap是一棵红黑相间的树。QHash是使用散列表实现的

QMapQHash慢。少于10个项目的QMap搜索速度比QHash快。

代码语言:javascript
复制
#include <QtCore/QtCore>
#include <unordered_map>
#ifndef CONTAINER
#error CONTAINER must be defined to QMap, QHash, std::map or std::unordered_map
#endif
namespace std {
/* std::hash specialization for QString so it can be used
* as a key in std::unordered_map */
template <class Key>
struct hash;
template <>
struct hash<QString> {
    typedef QString Key;
    typedef uint result_type;
    inline uint operator()(const QString& s) const { return qHash(s); }
};
}
int main(int argc, char** argv)
{
    if (argc < 2)
        qFatal("" Missing number of element to add "");
    QByteArray a = argv[1];
    uint num = a.toUInt();
    // creates an array of random keys
    QVector<QString> strs(num);
    for (int i = 0; i < num; ++i)
        strs[i] = qvariant_cast<QString>(qrand());
    CONTAINER<QString, QString> c;
    for (uint i = 0; i < num; ++i) {
        QString& k = strs[i];
        c[k] = QString::number(i);
    }
    quint64 it = 0;
    const QString* arr = strs.constData();
    QElapsedTimer t;
    t.start();
    while (t.elapsed() < 1000) {
        const QString& k = arr[(++it) * 797 % num];
        c[k]; // perform a lookup
    }
    qDebug() << it / 1000;
}

迭代值越高,效果越好。元素数量的比例是对数的。应该预料到,对于QHash,这个值不会随着元素数量的增加而改变,对于QMap,它应该等于log,这对应于对数刻度上的一条直线。

但是,对于大量的元素,结果并不有利于QMap。这很可能是使用QHash的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69751910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档