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;
}

出力は次のようになります。

1 2

1 2

2

2

最後の出力(最初のシングル「2」)の隣は、他の出力と同じように「12」である必要があります。

イテレータが最初の要素を超えない理由はありますか?

ありがとう。

4

1 に答える 1

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 ++ 03を使用している(C ++ 11を使用できない)場合は、次を追加します。

const_iterator begin() const { return itemSet.begin(); }
const_iterator end() const { return itemSet.end(); }
于 2012-05-06T18:15:32.997 に答える