Qt框架中的QMap与QList类

时间:2019-05-20 18:34:57

标签: c++ list qt hashmap containers

我正在尝试决定在将来的某些Qt项目中使用QList还是QMap类。为了确定最适合我的选择,我想确定它们的某些相似之处和不同之处,以便了解在某些情况下最有效的方法。我对这些异同的理解正确吗?

相似之处

  • 都是容器

  • 均包含无序数据

差异:

  • QMap具有键值对,而QList仅具有值

  • QMap使用哈希函数将值放置在适当的索引中 而QList只是追加条目

还有更多相似和不同之处吗?

我可以看一下通用计算机科学的定义,但是我读到某个地方Qt框架可能会有细微的差异。

2 个答案:

答案 0 :(得分:1)

QListQMap的数据组织方式不同。这导致不同的性能和稍微不同的内存消耗(在大多数情况下,后者通常无关紧要)。您可以在computational complexity中找到Qt documentation。如果要存储很多元素,则可能会有很大的不同。考虑选择容器时要多久访问一次数据(搜索vs.插入vs.删除)。

[但是请记住,算法复杂度是仅对大n有用的理论属性。实际上,由于locality of reference,在具有少量元素(<1,000)的数组中进行线性搜索的性能通常优于列表/树。如果您不关心性能,不要猜测,请务必进行评估。]

  

两者均包含无序数据

对于QMap而言,实际上并非如此。 QMap被实现为self-balancing binary search tree,它是一种排序的数据结构。

BTW:您通常可以以一种通用的方式来实现代码,以便以后轻松切换到其他容器类型(例如,如果访问模式更改或您的假设被证明是错误的)。使用auto可以帮助您减轻痛苦。

答案 1 :(得分:0)

我认为您在QMap上犯了一些错误。

QMap始终按键对内容进行排序。请参见Documentation here。因此,它并非像您提到的那样无序。

然后QMap不使用哈希函数。它通过将元素与operator<()进行比较来存储元素。

实际上,您是一个令人困惑的QMapQHashQHash实际上是任意排序的,其元素需要提供一个operator==()用于比较和一个qHash(key)函数。

我认为它可以帮助您更好地了解需要使用的内容。