搜索孩子

时间:2010-10-28 14:13:27

标签: c++ design-patterns

我有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宾语。

如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

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

这些案例的有用OOP设计模式是CompositePattern

答案 1 :(得分:0)

你对记忆有什么限制吗?如果没有,我会维护反向查找表(地图),所以你需要一个用于C-> B,当你添加D时,你需要第二个D-&gt; C,所以如果你有C,要正确定位它,你需要一个查找来定位B,然后从A你可以通过另外两个查找遍历。比遍历所有寻找C的B!要快得多!

另一种选择,您是否可以控制Guid,如果是这样,您可以尝试将“路径”信息输入到guid中。比如说B指南是“B.1”,“B.2”,“B.3”等。'。'之后的帖子修复。分隔符告诉你它是哪个B.当你添加C时,你可以简单地添加一个额外的'。',即C 1的guid是(让我们假设它存储在B 1)=“B.1.1”,所以现在找到对象,你解析密钥,然后瞧你有C1的“路径”。

答案 2 :(得分:0)

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

使用GUID可以获得对象和对象的父级。使用对象,您将获得GUID。从头开始递归。

答案 3 :(得分:0)

您可以将子项GUID的范围分配给每个父GUID。假设BGuid位于区间[0, 9]中,CGuid位于区间[0, 99]中。现在,您可以使用以下函数将CGuids映射到每个BGuid

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

现在,您将始终知道通过树的路径。当有许多节点时,您需要保持树的平衡以获得更好的性能。