2011-05-25 206 views
1

你好 我有以下structSTL容器的默認初始化

struct node { 
    std::string word 
    std::vector<struct node *> child; 
} 

當我創建新的節點,我也沒辦法初始化child vector。 我基本上想要的是檢查使用operator[]的任何元素是否有有效的值。 我想做以下

if (nodeptr->child[5]) { 
} 

但是代碼在if循環中崩潰。

有沒有其他的方法來處理這個問題。

+1

在C++中,'struct node *'中的'struct'是不需要的。 'node *'就夠了! – Nawaz 2011-05-25 07:18:13

+0

這些向量是否意味着在運行時具有特定的大小?做孩子[5]和孩子[50]'是否可以嗎?或者矢量是否增長,你只需要知道它是否增長超過一點(即位置N的指針不是0,如果它存在的話)? – 2011-05-25 07:20:12

+4

你應該說明你想解決的問題是什麼,而不是你的解決方案(或另外)。 – 2011-05-25 07:27:19

回答

4

在這種情況下,你將不得不爲你提供一個構造函數struct。

struct node { 
    node() : word(), child(10, NULL) {} 
    std::string word 
    std::vector<struct node *> child; 
} 

這將初始化矢量與10 NULL-指針。然後可以檢查索引是否爲NULL(表示它不包含數據),或不包含(它確實包含數據)。

+0

但我還沒有在子向量中插入任何元素。我想檢查指定索引中是否有任何有效的元素。 – Avinash 2011-05-25 07:16:23

+0

在這種情況下,你將不得不做更多的工作。改變你的支票:「if(child。size()> = 6 && child [5])' – RobH 2011-05-25 07:17:58

+0

謝謝,還有一個問題會處理查詢第11個或更大的索引元素。 – Avinash 2011-05-25 07:18:25

3

向量有一個構造函數,它需要一個計數和一個值。

vector(
    size_type _Count, 
    const Type& _Val 
); 

使用它。定義節點的構造函數:

節點::節點() :孩子(10,NULL){ }

4

的問題不是你的實際問題是什麼明確的,那就是無論你需要的矢量在構造後有一個給定的大小,還是隻是想檢查是否插入了第五個元素。

在第一種情況下,向量的大小是節點類的不變量,您應該在構造過程中強制執行不變量。構造函數添加到node(如其他人所說前):

struct node { 
    static const int NUM_CHILDREN = 10; 
    std::string word; 
    std::vector<node*> child; 

    node() : word(), child(NUM_CHILDREN) {} 
}; 

如果,另一方面,向量的大小不是不變的,並且要檢查第五元素是否插入以及是否它是非空,則更改如果條件:

if (nodeptr->child.size() > 5 && nodeptr->child[5]) { 

這個條件將驗證第一該載體已發展足夠(在位置5訪問元素,尺寸必須爲6或以上),然後是否位置5的元素不爲null。請注意,&&會短路,因此如果第一個條件不符合,則第二個條件未測試。

+0

我想要一個容器,我應該能夠檢查有效元素是否存在於指定的索引處,並且我應該能夠在任何索引處插入新的指針,我嘗試過使用stl向量。 – Avinash 2011-05-25 07:27:50

+0

@Avinash:正如David已經告訴過你的,這些信息應該是你問題的一部分。 – 2011-05-25 07:30:13

+0

@Avinash,你不能那樣做,std :: vector是一個動態大小的容器,即它隨着你的需要而增長。在開始的時候它會是空的,當你添加一個項目時(比如說使用'push_back()'方法),它會增長一個,你可以通過'[0]'來訪問這個索引等等。要做的事,你需要事先知道它有多少元素,比如100,然後用100個NULL初始化向量。然後你可以訪問任何高達100的索引,如果你需要100或更高,那麼你需要再次調整大小()。你試圖做的事情聽起來更像是它需要一張地圖,索引作爲關鍵。 – Nim 2011-05-25 07:33:10