【发布时间】:2019-09-27 09:42:46
【问题描述】:
假设我有一个“事件”对象队列,其中每个对象都有一个“事件类型”和某种数据字段。在 C++ 中可能是这样的:
enum class EventType
{
A,
B,
C
};
struct Event
{
EventType type;
std::string message;
};
比如说,我想要一个包含这些事件的队列,并且我希望队列具有以下属性:
- 当一个事件被推送到队列中时,相同
EventType的任何现有事件都将被删除。因此,当从队列中弹出一个事件时,它始终是其EventType的最新最近添加实例 -
不同
EventType的事件按照它们被推送的顺序弹出。 (pop()不会期望任何参数)。
因此队列对于Event 和LIFO 对于EventType 是FIFO。
示例:
以下事件被推送到队列中(字母为事件类型,数字为实例号)
A1 A2 C1 C2 C3 B1 B2 A3
如果 pop() 被调用 3 次,则按顺序返回的项目将是
C3 B2 A3
这种类型的数据结构有名称吗?有实现的例子吗?
【问题讨论】:
-
那么
pop需要指定事件类型吗? -
我可能遗漏了一些东西,但您的要求不意味着队列中恰好有 0 或 1 个给定类型的事件吗?你如何想象函数 Pop() 的签名是什么样的?您是否指定了事件类型?
-
听起来像是优先队列和驱逐队列的组合(当然还有自定义逻辑)
-
Qt documentation 谈论“压缩”事件。但目前尚不清楚这是否也适用于非相邻事件。
-
boost::bimap<unordered_set<EventType>, list_of<Event>> 可能是一个很好的基础数据结构。