2017-01-12 10 views
0

私はクアッドツリーを作成していますが、私は検索機能でいくつかの問題を抱えています。この関数は、オブジェクトを格納するノードに到達し、そのオブジェクトをrelevantObjectsというベクトルに格納します。 この後、relatedObjectsベクトルを返します。しかし、これをしようとすると、私はデバッガでベクトルがその要素の拭き取られることがわかります(4から0になります)。クワッドツリーの再帰的な検索

私はどこが間違っているのか分かりません。あなたの再帰関数std::vector<PTR> Tree::retrieveObjects(PTR p, std::vector<PTR> relevantObjects)

std::vector<PTR> Tree::retrieveObjects(PTR p, std::vector<PTR> relevantObjects) { 

int quadrant = getQuadrant(p); 

if (quadrant != -1 && nodes[0] != nullptr) 
{ 
    nodes[quadrant]->retrieveObjects(p, relevantObjects); 
} 

relevantObjects.insert(relevantObjects.end(), storedObjects.begin(), storedObjects.end()); 


return relevantObjects; } 
+1

(関数の戻り値を使用しないで)再帰呼び出しのノードを破棄した場合は、参照によってベクトルをすべて下に通してから、最上位レベルに戻すことも考慮してください(内部再帰関数をpublicから分割するベクトルを返すもの) – Borgleader

答えて

0

、あなたは値によってパラメータrelevantObjectsを渡します。それぞれのコールがnodes[quadrant]->retrieveObjects(p, relevantObjects)の場合、ベクトルrelevantObjectsのコピーが作成され、そのコピーに対してファンクションが動作します。

あなたの関数内では、relevantObjectsのそれぞれの操作が失われるように、[quadrant]->retrieveObjects(p, relevantObjects)の結果を使用しません。あなたの関数は、relevantObjects.insert(relevantObjects.end(), storedObjects.begin(), storedObjects.end());を実行した後、最初の入力のコピーをrelevantObjectsに返します。

この問題を解決するには、パラメータrelevantObjectsを「参照による呼び出し」にするだけです。つまり、署名をstd::vector<PTR> Tree::retrieveObjects(PTR p, std::vector<PTR> &relevantObjects)に変更するだけで問題なく動作します。

BTW:参照によってベクトルを渡すと、結果を返す必要はありません。 void Tree::retrieveObjects(PTR p, std::vector<PTR> &relevantObjects)のような署名で十分です。

+0

ありがとう!それはとても明白でしたが、私はそれを見逃しました。 – marete

関連する問題