问题:我希望能够FIFO队列传出消息。出于更新/删除的原因,我还希望能够根据对象ID访问队列中的每条消息。
我目前已经实现了一个解决方案,其中数据被推送到双端队列,并保留了该数据的迭代器。然后将由对象ID键入的迭代器放入映射中。这在我做过的一个地方很好,但我现在发现自己想要在其他地方这样做。
我是否过度复杂化了这个问题?有没有一个数据结构可以做到这一点?
答案 0 :(得分:12)
为什么不将deque作为ID的deque,并将地图从ID映射到对象。然后,当您在双端队列中访问ID时,您将在地图中查找ID。如果ID是全局唯一的,则只需要一个映射来为所有deques提供服务。
答案 1 :(得分:3)
我使用Boost.MultiIndex做了非常相似的事情。使用它,您可以拥有一个只有一次数据的容器,但可以通过两个(或更多!)访问它 facades:一个看起来像一个列表,另一个看起来像一个地图。使用一个外观擦除元素(例如,从列表中弹出)时,另一个视图将无缝更新。
答案 2 :(得分:1)
我会尝试相反的方式。利用地图作为主要数据结构。让队列包含可用于从地图中查找对象的对象ID。就迭代器而言,您不需要跟踪所有额外信息 - 只需要一个数据映射和一个对象ID队列。