我正在使用qtxml编写xml文件,我发现每次运行我的程序时,输出xml文件的元素属性都有不同的顺序。
我阅读了源代码,发现qtxml使用QHash来存储元素属性,这将导致每次运行我的程序时,输出的XML文件的元素属性具有不同的顺序。
为什么不使用QMap来存储元素的属性呢?这将产生一个有序属性。
在这种情况下,QHash和QMap有什么不同?
发布于 2021-10-29 17:37:36
QMap是一棵红黑相间的树。QHash是使用散列表实现的
QMap比QHash慢。少于10个项目的QMap搜索速度比QHash快。
#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的原因。
https://stackoverflow.com/questions/69751910
复制相似问题