四叉树递归检索



我正在创建一个四叉树,我在检索函数时遇到了一些麻烦。此函数深入到存储对象的节点,并将对象放入名为 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());后将第一个输入的副本返回给relevantObjects

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

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