C ++的多重关联问题

时间:2009-11-26 19:02:48

标签: c++ indexing maps

你会如何解决这个问题? (一开始看起来很简单,然后我发现它令人费解)。

  • 您有一个名为Executor的类。假设你有很多实例,并且在调用方法do(Argument)时会执行不同的操作。
  • 参数有2个不同的参数,它们是A * pa,B * pb(其中一个可以为null)
  • 现在,我想要一个接收Argument istances的类管理器,并将它们转发到相应的Executor实例(让我们调用这个方法Filter)。这是在一段时间之后完成的,每个Executor都调用了Manager.subscribe(A * pa,B * pb)方法,以便对其中一个感兴趣。请注意:如果pa或(不是两者)pb都为NULL,则表示ANY(我的意思是如果pa为NULL,则仅检查pb)。当然,一定不能超过一个执行人。
  • 实现必须是FAST,理想应该是一个向量,或者像哈希映射一样接近...但是比较是在pa和pb的内容上进行的,而不是它们作为指针的值。
  • 最后,执行者必须可以取消订阅(无需等待太长时间)。无论如何,我想要Filter,subscribe和cancelSubscription非常快。

我一直在考虑许多安排,包括哈希映射,列表和多重映射......但是所有这些都缺乏速度或简单性,或者其他东西。你会做什么?

1 个答案:

答案 0 :(得分:2)

我认为您要创建一个名为“Subscription”的类,它表示从Executor到Manager的单个订阅,其中包含有关此订阅将在何种条件下触发的信息,以及此订阅的某种GUID或名称。我在想像

 class Subscription
 {
   GUID g;
   A_filter a;
   B_filter b;
   Executor *e;
 }

Subcription还有一个方法来“检查”它是否应根据给定的A和B值触发,然后在这些参数匹配的情况下调用执行程序。

然后,Manager类将包含三个映射,其中一个映射Guid到Subscription *并允许非常快速的取消订阅,基本上在取消订阅请求中查找GUID以获取Subscription对象,使用该对象确定哪些值为可能需要从A地图和B地图中删除A和B,然后删除该对象。订阅只需创建Subscription对象并将值添加到Guid Map,A Map和B Map。

根据(A,B)进行查找,如果A或B为空,则在另一个哈希表中查找并触发返回的订阅。如果A和B都不为空,事情变得更加棘手。

在这里,要做的事情是通过查找A并查找B.返回的集合上找到一个交集。这可以手动完成,但更快的方法可能只是有一个额外的地图,关键是B附加在A。