【问题标题】:How to implement a queued map?如何实现排队地图?
【发布时间】:2009-08-03 17:37:37
【问题描述】:

问题:我希望能够对传出消息进行 FIFO 队列。出于更新/删除的原因,我还希望能够根据对象 ID 访问队列中的每条消息。

我目前实施了一个解决方案,将数据推送到双端队列中,并保留该数据的迭代器。然后将由对象 ID 键入的迭代器放入映射中。这在我做的地方很好,但我现在发现自己想在其他地方做。

我是否使问题过于复杂?是否已经有数据结构可以做到这一点?

【问题讨论】:

  • 我认为要做得更好,我们必须知道你在做什么。通常,当您将某些东西推入队列时,您只关心前面。你不应该修改它。

标签: c++ algorithm stl


【解决方案1】:

为什么不将双端队列设为 ID 的双端队列,并将映射设为从 ID 到对象的映射。然后,当您访问双端队列中的 ID 时,您会在映射中查找该 ID。如果 ID 是全局唯一的,您只需要一张地图即可为所有双端队列提供服务。

【讨论】:

  • 我起初避免使用这种解决方案,因为它不允许我根据 ID 删除队列中的节点。然后我意识到这没有必要。当队列最终处理节点时,映射的数据可以决定要做什么。要么键已被删除,要么调用数据对象决定不再需要处理。
【解决方案2】:

我使用Boost.MultiIndex 做了非常相似的事情。使用它,您可以拥有一个仅包含一次数据的容器,但可以通过两个(或更多!) 立面:一个看起来像一个列表,另一个表现得像一张地图。当您使用一个外观删除一个元素时(例如,从列表中弹出),另一个视图将无缝更新。

【讨论】:

  • 这里相同,只是我使用了 boost.bimap(具有 2 个索引的映射;一个用于优先级,另一个用于“ObjectID”)。
【解决方案3】:

我会尝试反其道而行之。使用地图作为您的主要数据结构。让队列包含可用于从地图中查找对象的对象 ID。就迭代器等而言,您不需要跟踪所有额外信息 - 只需一个数据映射和一个对象 ID 队列。

  • 编辑- 尼尔打败了我,道具给了他:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-16
    • 2011-01-18
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多