2016-10-20 56 views
-1
struct Node{ 
    Node* ch[26]; 
    string str; 
    Node(){ 
     for(int i = 0; i < 26; i++) { 
      ch[i] = NULL; 
     } 
     str = ""; 
    } 
}; 
class Solution { 
public: 
    vector<string> results; 
    Node* root; 
    void insert(Node* p, string s) { 
     int len = s.size(); 
     for(int i = 0; i < len; i ++) { 
      if(p->ch[s[i] - 'a'] == NULL) { 
       p->ch[s[i] - 'a'] = new Node(); 
      } 
      p = p->ch[s[i] - 'a']; 
     } 
     p->str = s; 
    } 
    vector<string> wordSearchII(vector<vector<char> > &board, vector<string> &words) {} 
} 

這是我爲我的問題定義的Trie。 「根」和「向量結果」都是Solution的成員變量。我想問的問題是,爲什麼我在使用root之前必須「新建Node()」。在使用結果之前,我不需要「新的矢量」。我明白解決方案將調用默認構造函數,然後「結果」將調用其默認構造函數。爲什麼root不能使用Node的默認構造函數?類可以默認初始化其「指針成員變量」?

我碰巧意識到我的困惑可能與「指針」有關。但我仍然不瞭解細節。任何人都可以解釋一下嗎?對此,我真的非常感激。

+0

我不明白你的問題。 – amanuel2

+0

@ amanuel2我嘗試直接在函數「wordSearchII」中使用root。這是行不通的。如果我在將單詞插入Trie之前使用「root = new Node()」,它將起作用。我只是認爲Solution類會爲我初始化「Node * root」。另一種表達我的問題的方法是:將像指針一樣的指針默認初始化? – wangzishan

+0

'Solution'不會將'root'初始化爲任何東西,因爲你沒有告訴它!不,指針不是默認初始化的,你必須自己初始化它。 –

回答

0

root只是一個指針,但你沒有指定任何東西指向它。您需要分配一個新的Node對象,然後該對象的地址分配給root,如:

class Solution { 
public: 
    vector<string> results; 
    Node* root; 

    Solution() { 
     root = new Node; 
    } 

    ~Solution() { 
     delete root; 
    } 

    ... 
}; 

否則,不要讓root是一個指針都:

class Solution { 
public: 
    vector<string> results; 
    Node root; 

    ... 
}; 

在一個側面說明,你Node類需要析構函數摧毀被添加到它的任何子節點:

struct Node{ 
    Node* ch[26]; 
    string str; 

    Node(){ 
     for(int i = 0; i < 26; i++) { 
      ch[i] = NULL; 
     } 
    } 

    ~Node(){ 
     for(int i = 0; i < 26; i++) { 
      delete ch[i]; 
     } 
    } 
}; 
+0

感謝您的回答。我只有一個小問題。對於第一部分代碼,您使用「root = new Node;」。這個初始化後我曾經添加括號。例如,「root = new Node();」。我已經檢查過你初始化的方式。你也是對的。這兩種方式都是「默認構造函數」嗎? – wangzishan

+0

@wangzishan請參見[類型名稱後的圓括號是否與新的區別?](http://stackoverflow.com/questions/620137/) –

0

Node* root; 

*意味着root指針一個Node對象,它不是一個實際Node對象本身。指針所具有的唯一存儲空間足以保存指針指向的內存地址。指針必須指向某個東西。現在,你不知道什麼root指向,這是...壞。如果你試圖閱讀它,你就不知道你會得到什麼,而且你不知道如果你試圖寫入它會粉碎什麼。您需要指定root指向的某處,如果這是new Node(),那麼可以,但它也可以是預先存在的Node或自動存儲中的Node(在堆棧中的某處)。

在另一方面,在

vector<string> results; 

results不是指針到一個vector對象。這是實際的vector對象。它的存儲。沒有必要爲它分配內存,只需在堆棧中聲明它爲它分配所有內容並調用它的默認構造函數即可。