2010-10-28 73 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