如何实现一个队列映射?

4
问题:我希望能够对输出的消息进行FIFO排队。为了更新/删除原因,我还希望能够根据对象ID访问队列中的每个消息。
我目前实现了一个解决方案,其中数据被推入deque中,并保留了对该数据的迭代器。迭代器由对象ID作为键,并放置在映射中。这在我做的一个地方很好,但我现在发现自己想在其他地方这样做。
我是否过于复杂化问题?是否已经有一种数据结构可以完成这个任务?

我认为要更好地完成这个任务,我们需要知道你正在做什么。通常情况下,当你将某些东西推入队列时,你只关心队列的前端,而不应该对其进行修改。 - GManNickG
3个回答

12
为什么不将双端队列制作成ID的双端队列,然后将映射制作成从ID到对象的映射。这样当您访问双端队列中的ID时,可以在映射中查找该ID。如果所有ID都是全局唯一的,则只需要一个映射即可为所有双端队列提供服务。

一开始我避免使用这样的解决方案,因为它不允许我根据ID删除队列中的节点。然后我意识到这是不必要的。当队列最终处理节点时,映射的数据可以决定如何处理。要么键已被删除,要么对数据对象的调用决定不再需要进行处理。 - Mike Lewis

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

一样的情况,只不过我使用了boost.bimap(具有两个索引的映射;一个用于优先级,另一个用于“ObjectID”)。 - timday

1
我建议你尝试另一种方式。将地图作为主要数据结构。让队列包含对象ID,你可以使用这些ID从地图中找到对象。你不需要跟踪所有额外的信息,如迭代器等 - 只需要一个数据地图和一个对象ID队列。
  • 编辑 - Neil比我先完成了,向他致敬 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接