【问题标题】:QMap vs QList Class in the Qt frameworkQt 框架中的 QMap 与 QList 类
【发布时间】:2019-10-07 03:31:29
【问题描述】:

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

相似之处:

  • 都是容器

  • 两者都包含无序数据

区别:

  • QMap 有键值对,而 QList 只有值

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

还有哪些相同点和不同点?

我可以查看通用的计算机科学定义,但我在某处读到 Qt 框架可能存在细微差别。

【问题讨论】:

  • 请澄清Both contain unordered data的意思。
  • 如果您必须访问 List 的任何索引,它将按照插入的顺序进行。所以列表不会在每次插入后自行恢复。
  • 好的,但 QMap 的情况正好相反。

标签: c++ list qt hashmap containers


【解决方案1】:

QListQMap 的数据组织方式不同。这会导致不同的性能和略微不同的内存消耗(对于大多数用例,后者通常无关紧要)。您可以在Qt documentation 中找到computational complexity。如果您要存储很多元素,这可能会产生很大的不同。考虑一下您在选择容器时想要访问数据的频率(搜索、插入和删除)。

[但请记住,算法复杂度是一个理论属性,仅对较大的 n 有用。实际上,由于locality of reference,通过具有少量元素(

两者都包含无序数据

QMap 实际上并非如此。 QMap 实现为 self-balancing binary search tree,这是一个排序的数据结构。

顺便说一句:您通常可以以通用方式实现您的代码,以便以后轻松切换到另一种容器类型(例如,如果访问模式发生变化或您的假设被证明是错误的)。使用 auto 可以帮助您轻松完成此操作。

【讨论】:

    【解决方案2】:

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

    QMap 保持其内容始终按键排序。请参阅Documentation here。所以它不是你提到的无序。

    那么QMap 不使用散列函数。它通过将元素与operator<() 进行比较来存储元素。

    事实上,你混淆了QMapQHashQHash 确实是任意排序的,它的元素需要提供一个operator==() 用于比较和一个qHash(key) 函数。

    我认为它可以帮助您更好地了解您需要使用什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多