如何更好地使用Qvector <qhash <qstring,qstring>>处理元素分配

时间:2019-05-04 16:11:03

标签: qt

我有:

typedef QHash<QString,QString> CueTrack;
QVector<CueTrack> tracks;

每个QHash必须存储12对。

QVector应该包含0到99个元素,但是我不知道它们将提前多少个,因为它取决于将从外部用户文件读取运行时的数据。预计平均约为10。在大多数情况下为5至15;很少会超过20,几乎永远不会超过30(但是,在极少数情况下,它们可以达到99)。

我想到了两种情况:

a)不需要初始调整大小并在需要时调整大小

typedef QHash<QString,QString> CueTrack;
QVector<CueTrack> tracks;
...
tracks.resize(i+1);
tracks[i]["cmd"] = "val";
...

b)初始尺寸

typedef QHash<QString,QString> CueTrack;
QVector<CueTrack> tracks(99);

我有疑问,我想了解:

  1. 首选方案是什么,尤其是在性能方面?

  2. 还有其他可能更好的方案吗?

  3. 此处应使用squeeze()吗?何时何地?

1 个答案:

答案 0 :(得分:0)

空的QHash不会占用太多空间,而99(对于计算机)是非常小的数据集。

此外,Qt容器具有指数增长策略。如果分配的容器空间太小,它将增加一倍。

因此,如果您调整(+1)的大小,它将以2的幂增加(大约)。

QHashQMap的优势在于它也可以预先分配。

可能您最好的策略是:

tracks.reserve(20);

// When adding a new track:
tracks.resize(i+1);
tracks[i].reserve(12); // number of pairs

但是,以及所有与性能有关的问题:配置文件,然后忽略:-)