2013-05-21 121 views
0

我正在研究一個非二叉樹結構,因此,我有一個結構定義如下,其中有一個數據,它的所有孩子都在一個名爲child的向量中。迭代結構中定義的向量

struct node{ 
    string data; 
    vector< node* > child; 
    vector<node*>::iterator i 
    int Count; 
}; 

我有我已經定義了打印的孩子在載體另一個函數,但我不能讓迭代工作

void printTree(node* &a){ 

    for(a->i = a->child.begin(); a->i !=a->child.end();++i) 
     cout << *(a->i)->data <<endl; 
} 

迭代器是不是我得到一個錯誤在調用printTree時定義。我嘗試在printTree函數內部定義迭代器,但是我一直收到錯誤。有關如何更改我的代碼的任何建議?

+1

爲什麼你需要每個節點的迭代器? –

+1

有沒有理由讓你的節點裏面有迭代器? – Joe

+1

可能不是解決方案,但在for循環中,您正在增加'i'而不是'a-> i'。 – 0x499602D2

回答

3

請從你的node結構中取出迭代器。

void printTree(node* &a) 
{ 
    for(vector<node*>::iterator i = a->child.begin(); i != a->child.end(); i++) 
    { 
     cout << (*i)->data << endl; 
    } 
} 

[編輯]

即使我感到很困惑,當我寫了這個答案。很多時候我拯救自己的醜陋和潛在的混亂迭代通過這樣的循環中提領:

node * n = *i; 
cout << n->data << endl; 

更一般地,如果我有SomeContainer<SomeType>,我這樣做:

for(SomeContainer<SomeType>::iterator i = foo.begin(); i != foo.end(); i++) 
{ 
    SomeType & val = *i; 
    // ... 
} 

上述方法特別方便,當你迭代通過map,並必須使用i->second來獲取您的數據,而不是*i

+0

我試過這個,我得到了'* i .__ gnu_cxx :: __ normal_iterator <_Iterator,_Container> :: operator - >> ',這是指針類型'節點*'(也許你打算使用' - >'?)「 關於如何解決這個問題的任何建議? – bachkoi32

+0

對此抱歉抱歉。需要在'* i'周圍放置括號。當你執行'* i'時,它將迭代器解引用到包含的類型('node *')中,然後我們使用箭頭運算符來獲取'data'成員。請參閱編輯的答案。 – paddy

+0

謝謝!這工作! – bachkoi32