【问题标题】:Which data structure would be best for this?哪种数据结构最适合这个?
【发布时间】:2011-07-31 16:06:34
【问题描述】:

对于我的游戏,当对象进入传感器时,我需要将其添加到列表中,而当对象离开传感器时,需要将其从列表中删除。我还需要能够快速找到那个对象。

所以本质上:

我需要它来做: 快速添加、快速删除和快速查找。

鉴于在任何给定时间,该结构将有大约 10 个对象,哪种数据结构最适合。

谢谢

【问题讨论】:

  • > 我需要它来做:快速添加、快速删除和快速查找。 QuickStruct 是必经之路
  • 一个虚构的理想数据结构。

标签: c++ data-structures


【解决方案1】:

如果有 10 个对象(std::vectordequeset),任何事情都可以,在进行分析之前,没有人能判断出哪个对象的性能更好。

如果您不知道该使用什么,也许您会发现std::set 具有更好的语法来查找元素。这是我在这种情况下使用的,因为我不想写std::find(v.begin(), v.end(), sensor),我可以简单地写s.find(sensor)

虽然一般建议不要使用std::list。在 C++ 中使用链表需要一个令人信服的理由(恒定时间拼接是一个,没有迭代器失效是另一个)。其他数据结构对大多数操作(拼接除外)表现更好。在这里,我认为使用 list 而不是例如,没有任何意义。 set.

【讨论】:

  • Set 提供了很好的查找速度,但元素的插入和删除不如列表快。应该考虑哪个操作执行的频率更高。
  • @neodelphi:在集合上找出插入或删除的位置比在列表上要快。所以我不会像你那样明确。此外,在 10 个元素的向量中插入和删除可能比在列表中快得多(出于数据局部性原因)。目前还不清楚哪个容器的性能更好,但我坚信 std::list 落后。强迫自己仅在需要时使用列表是个好主意,因为它们的整体性能很差。
【解决方案2】:

我建议std::list,因为它非常适合插入和删除元素。

【讨论】:

  • 我什至不会说它对插入元素有好处。这很慢。
  • 因为链表必须为每个元素动态分配一个节点。这很慢。
  • 在向量中插入元素要慢得多!对于大量的对象,插入链表可能会有很好的性能,因为它是在恒定的时间内。
【解决方案3】:

快速添加,快速删除和快速查找,您不需要太多!鉴于您所说的,我会说链表,但这也取决于添加、删除和查找的频率。如果您发现的频率远高于添加或删除内容的频率。

真正唯一的方法是尝试几个不同的选择并计时。

【讨论】:

    【解决方案4】:

    我认为链接列表是最好的。鉴于尺寸较小,移动指针的行为不会影响性能。

    【讨论】:

      猜你喜欢
      • 2021-03-17
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多