2012-05-06 49 views
0

我有一個TreeVertex類:列表迭代器不遍歷所有元素

// TreeVertex.h 
#ifndef __TREEVERTEX__ 
#define __TREEVERTEX__ 

#include <list> 

using namespace std; 

class TreeVertex { 
public: 
    TreeVertex(list<int>, TreeVertex* = NULL); 
    list<int> getItemset(); 
private: 
    list<int> Itemset; 

    TreeVertex * Parent; 
    TreeVertex * LeftChild; 
    TreeVertex * RightSibling; 
}; 

#endif // __TREEVERTEX__ 

// TreeVertex.cpp 

#include "TreeVertex.h" 

TreeVertex::TreeVertex(list<int> Itemset, TreeVertex* Parent) : Itemset(Itemset),  Parent(Parent), LeftChild(NULL), 
    RightSibling(NULL) { } 

list<int> 
TreeVertex::getItemset() { 
    return Itemset; 
} 

和一個主功能是這樣的:

#include <iostream> 
#include "TreeVertex.h" 

using namespace std; 

int main (int argc, const char ** const argv) 
{  
    list<int> tmpList1; 
    tmpList1.push_back(1); 

    TreeVertex * tmpTreeVert1 = new TreeVertex(tmpList1); 

    list<int> tmpList2; 
    tmpList2.push_back(2); 

    TreeVertex * tmpTreeVert2 = new TreeVertex(tmpList2); 

    list<int> newVertItemset; 

    newVertItemset.push_back(tmpTreeVert1->getItemset().front()); 
    newVertItemset.push_back(tmpTreeVert2->getItemset().front()); 

    cout << newVertItemset.front() << " " << newVertItemset.back() << endl; 

    TreeVertex * newTreeVert = new TreeVertex(newVertItemset); 

    cout << newTreeVert->getItemset().front() << " " << newTreeVert->getItemset().back() << endl; 

    for (list<int>::iterator it = newTreeVert->getItemset().begin(); it != newTreeVert->getItemset().end(); ++it) { 
     cout << (*it) << " "; 
    } 

    cout << endl; 

    cout << newTreeVert->getItemset().size() << endl; 
    return 0; 
} 

輸出看起來是這樣的:

下到最後的輸出(第一單 「2」),應爲 「1 2」 只是像其他人。

任何想法爲什麼迭代器沒有超過第一個元素?

謝謝。

+1

不要使用'__TREEVERTEX__'作爲包含守衛,以雙下劃線開頭的名字保留給實現。一個更好的頭球后衛簡直就是'TREEVERTEX_H'。爲什麼你要在堆上創建'TreeVertex'對象?如果你確實在堆上創建它們,你必須記得'刪除'它們! –

+0

謝謝。我會去做。對於這個例子,你是對的:我不需要在堆上創建對象。在真實的代碼中,我需要指針。 –

回答

8

與此問題:

list<int> 
TreeVertex::getItemset() { 
    return Itemset; 
} 

每次調用此函數,它返回對象的副本,這意味着接下來的循環中不應該工作:

for (list<int>::iterator it = newTreeVert->getItemset().begin(); 
         it != newTreeVert->getItemset().end(); ++it) { 

,因爲它比較來自兩個不同對象的迭代器。一種解決方案是返回參考爲:

list<int> & //<--- return reference, not copy 
TreeVertex::getItemset() { 
    return Itemset; 
} 

然而,更好的解決方案是完全和代替的那除去getItemset,添加begin()end()成員函數爲:

//define these typedefs first in the public section 
typedef list<int>::iterator iterator; 
typedef list<int>::const_iterator const_iterator; 

iterator begin() { return itemSet.begin(); } 
iterator end() { return itemSet.end(); } 

,然後寫入for環路:

for(TreeVertex::iterator it = newTreeVert->begin(); 
         it != newTreeVert->end(); ++it) { 

如果你可以使用C++ 11,那麼你應該添加這些:

//note : the function names start with `c` 
const_iterator cbegin() const { return itemSet.cbegin(); } 
const_iterator cend() const { return itemSet.cend(); } 

或者,如果您使用C++ 03(且不能使用C++ 11),然後將這些:

const_iterator begin() const { return itemSet.begin(); } 
const_iterator end() const { return itemSet.end(); } 
+1

非常好。謝謝。 –