2010-10-28 72 views
0

我有班级A.班级A负责管理B对象的生命周期,它包含B对象的容器,它是map<BGuid,B>,每个B对象都包含C对象的容器,它是map<CGuid,C>。我有一个全局的A整个应用程序的对象。检索孩子

我有以下问题: 我有CGuid对象,我想用它来找到我的C对象。但为了这一点,我还需要知道BGuid对象,它会告诉我哪个B对象应该看起来像C对象。但我拥有的是CGuid,这意味着我必须检查每个B对象,看它是否包含我的C对象。不过我认为这很混乱。 我以为也许我应该有另一个类说M将包含所有我的C对象的地图,我可以直接在它与CGuid搜索,但这意味着我需要维护额外的地图只是为了搜索。

另外我除了在将来我的C类包含map<Dguid,D>所以我会有同样的问题的D对象,这一次更糟糕,我需要Bguid,Cguid和Dguid来找到我的D对象。

如何解决这个问题?

+0

只想说,我的GUID是实际指向的对象,即BGuid是B *等。我无法改变这一点。 – user152508 2010-10-28 14:49:05

+1

如果没有指向它的指针,地球究竟是“找到”一个对象? – Puppy 2010-10-28 14:51:05

+0

好吧,对。我写的不对。我有指向其他对象的指针,而不是对象本身。 – user152508 2010-10-28 14:59:56

回答

0

你对内存有任何限制吗?如果没有,我会保留反向查找表(地图),所以你需要一个C-> B,当你添加D时,你需要第二个D-> C,所以如果你有C,找到它正确的,你需要一次查找来定位B,然后从A开始,可以进一步查找两次。比遍历寻找C的所有Bs快得多!

另一种方法是,你是否可以控制Guid,如果是的话,你可以尝试在guid中加入“路径”信息。举例来说,B guid是“B.1”,“B.2”,“B.3”等后缀。分隔符告诉你它是哪个B.当你添加C时,你可以简单地添加一个额外的'。',即C 1的guid是(让我们假设它存储在B 1)=“B.1.1”,所以现在找到对象,你解析键,瞧你有你的“路径”C1。

0

map<BGuid,B>map<CGuid,pair<B,C>>map<DGuid,pair<C,D>>

随着GUID你得到的对象和对象的父。用对象你得到GUID。从开始递归。

0

您可以将孩子的GUID的范围分配给每个父亲GUID。假设BGuid在区间[0, 9]CGuid之间的区间为[0, 99]。现在,您可以用这样的功能映射10 CGuidsBGuid

mapGuids(B): CGuid => BGuid = B % 10 

现在,你将永远知道采取通过树哪条路径。当有许多节点时,您会希望保持您的树平衡以获得更好的性能。

1

你有一个经典的亲子关系。 我建议你不要指定如何处理(即用地图)来改进你的设计。 使用容器来存储儿童,并让儿童有一个指向父母的指针。通过这种方式很容易从任何点到顶端遍历。

一个有用的面向对象设计模式对于这些情况是CompositePattern