四叉树递归检索

Quad tree recursive retrieve

我正在创建一个四叉树,但在使用检索函数时遇到了一些麻烦。这个函数深入到存储对象的节点,并将对象放入一个名为 relevantObjects 的向量中。 在此之后,它 returns relevantObjects 向量。但是,当它尝试这样做时,我在调试器中看到矢量被擦除其元素(从 4 变为 0)。

我没看出我哪里错了。

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

在你的递归函数std::vector<PTR> Tree::retrieveObjects(PTR p, std::vector<PTR> relevantObjects)中,你按值传递参数relevantObjects;每次调用 nodes[quadrant]->retrieveObjects(p, relevantObjects) 时,都会创建一个向量 relevantObjects 的副本,然后该函数会对副本进行操作。

在你的函数中,你没有使用 [quadrant]->retrieveObjects(p, relevantObjects) 的结果,这样对 relevantObjects 的相应副本的操作就会丢失;在执行 relevantObjects.insert(relevantObjects.end(), storedObjects.begin(), storedObjects.end());.

后,您的函数将 return 将第一个输入的副本复制到 relevantObjects

要解决这个问题,只需将参数 relevantObjects 设为 "call by reference",即将您的签名更改为 std::vector<PTR> Tree::retrieveObjects(PTR p, std::vector<PTR> &relevantObjects),它应该可以工作。

顺便说一句:如果通过引用传递向量,则不需要 return 结果; void Tree::retrieveObjects(PTR p, std::vector<PTR> &relevantObjects) 这样的签名就足够了。