2012-05-06 25 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) { 

2つの異なるオブジェクトのイテレータを比較します。溶液をとして参照を返すことである。

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++ 11を使用することはできません)C++ 03を使用する場合は、これらを追加します。

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

優れています。ありがとう。 –

関連する問題