私はこの問題を解決しました!私がvector<Node*> children;
を使用しなければならないことが分かった。しかし、私は非常に理由が分からない、誰かがなぜ私に教えてくれますか?感謝:)私のDFSツリーの予期せぬ結果(C++)
質問:
は、私のようなツリー構造を生成するためにtest.cpp
を使用します。
root
は2人の子供がいるので、(ROOT->children).size()
の結果は、2
あります。
((ROOT->children)[0].children).size()
の結果は、root
の最初の子が2つの子を持つため、2
である必要があります。しかし、答えは0
です、なぜですか?それは本当に私のために混乱します。
ます。test.cpp(このコードは、Visual Studio 2010で実行可能である)
#include <iostream>
#include <vector>
using namespace std;
struct Node {
int len;
vector<Node> children;
Node *prev;
Node(): len(0), children(0), prev(0) {};
};
class gSpan {
public:
Node *ROOT;
Node *PREV;
void read();
void insert(int);
};
int main() {
gSpan g;
g.read();
system("pause");
}
void gSpan::read() {
int value[4] = {1, 2, 2, 1};
ROOT = new Node();
PREV = ROOT;
for(int i=0; i<4; i++) {
insert(value[i]);
}
cout << "size1: " << (ROOT->children).size() << endl; // it should output 2
cout << "size2: " << ((ROOT->children)[0].children).size() << endl; // it should output 2
system("pause");
}
void gSpan::insert(int v) {
while(v <= PREV->len)
PREV = PREV->prev;
Node *cur = new Node();
cur->len = v;
cur->prev = PREV;
PREV->children.push_back(*cur);
PREV = cur;
}
私はこの声明が意味することを理解していません。「あなたが維持しようとしている子供のコピーのみを見つけます。あなたのすべてのノードも流出します。 'ベクトル children'を使うと、' Node'オブジェクトは私がpush_backすれば子供の中になければなりません。しかし、なぜそれが消えていますか?お返事をありがとうございます。 –
LoveTW
あなたはあなたが指しているがそのコピーを指している 'Node'を入れません。 C++オブジェクトでは、ポインターではなく、値mがあります。すべての 'Node'オブジェクトに対して矩形を描画し、対応する' Node'にすべての 'Node * 'の矢印を描くと、問題を見ることができます:' 'cur''を' push_back() 'すると、 '(つまり四角形)を' children'ベクトルに追加しますが、あなたはそれに対してmoの矢印を持っています。後で子を追加するときは矢印で変更しますが、サイズを見るときは配列を経由します。 –
あなたの返信ありがとう!それでは:) – LoveTW