2009-12-22 57 views
1

這是一個問題:如何動態添加對象

如何做到正確?
IT =動態添加對象(指創建類結構,以支持)

class Branch 
{ 
    Leaves lv;   //it should have many leaves!! 
} 

class Tree 
{ 
    Branch br;   //it should have many branchs!!! 
} 

現在非工作例子(既不是C++ !!,但我儘量畫的想法)

class Branch 
{ 
    static lv_count; 

    Leaves lv; //it should have many leaves!! (and should be some pointer) 

    public: 
    add(Leave lv) 
    { 
     lv[lv_count] = lv; 
     lv_count ++ ; 
    } 
} 

class Tree 
{ 
    static br_count; 

    Branch br; //it should have many branchs!!! (and should be some pointer) 

    Tree 
    public: 
    add(Branch br) 
    { 
     br[br_count] = lv; 
     br_count ++ ; 
    } 

} 

這是例如,達到了一個愚蠢的方法:

class Branch 
{ 
    static count; 
    Leaves l[1000]; //mmm i don't like this 
    //... 
} 

class Tree 
{ 
    static count; 
    Branch b[1000]; //mmm i don't like this 
    //... 
} 

我想知道這樣做的正規正常的方式,感謝!!!!!!

+4

我看到了,您已將問題標記爲「矢量」 。你很接近解決方案=) – SadSido 2009-12-22 15:27:38

+0

如果你想要實現像B-Tree(有分支頁面)的東西,我建議自頁面以來的一個數組,因爲它很可能在整個樹中保持一致。唯一的區別可能是葉節點。 – 2009-12-22 17:29:48

回答

3

的std ::向量的東西,你所尋找的,我猜...

class Tree 
{ 
    std::vector<Branch> branches; 
}; 
+0

你打敗了我。 :) – 2009-12-22 15:26:55

+2

看來我無法避免std庫! well..at最少這將節省我的代碼許多星號! =) – Hernan 2009-12-22 15:29:28

+1

@赫爾南:我不會說「不能」比「不應該」多。 8v) – 2009-12-22 15:31:22

1

載體是通用的解決方案。然而,在開始使用庫代碼(如C++ new,calloc,malloc,線程本地內存等)之前,您應該先看看內存分配情況。每個STL容器都有自己的算法複雜性,並且學習這些將幫助您選擇正確的

討論:

如果你想要的東西成長,你沒有空間了吧....好你要的realloc()或將算法。獲取更大的內存緩衝區,並將舊緩衝區複製到處,正確的索引偏移量爲。這是幕後的矢量;通過使用線性函數(2x),這個過程向量可以非常好地實現(這是特定實現)。以這種方式增長意味着它擁有比它需要更多的內存,這意味着未來添加到向量中的數據不會立即重新分配。

但是,我必須補充說,這是非常低效的,你幾乎總是可以避免複製東西的代價。 Vector的主要用途是用於連續內存區域,通過使用鏈接的數據結構,您幾乎可以在矢量上進行改進,也許可以在二叉樹中搜索關鍵字:D

+4

默認值不應該是「在std :: vector之前考慮calloc/malloc」,而是另一回合。總是比較喜歡STL,它的設計和編寫遠比你或我更聰明的人。 – meagar 2009-12-22 15:41:55

+1

也許你不認爲自己很聰明,但我寫了很多低級別的代碼:D。但是,如果合適,我也會自己使用矢量。如果有人問一個問題,你應該幫助他們獲得知識,而不是在一個盤子上給他們一個答案。 – 2009-12-22 15:44:49

+1

未來幾個月,很多人都會閱讀此答案。這裏應該沒有更多的知識和討論,而不僅僅是正確的答案? – 2009-12-22 15:46:44