【问题标题】:Quad tree recursive retrieve四叉树递归检索
【发布时间】:2017-01-12 14:24:36
【问题描述】:

我正在创建一个四叉树,但在使用检索功能时遇到了一些问题。这个函数深入到存储对象的节点,并将对象放入一个名为relatedObjects 的向量中。 在此之后,它返回相关对象向量。但是,当它尝试这样做时,我在调试器中看到向量的元素被擦除(从 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; }

【问题讨论】:

  • 您从递归调用中丢弃任何节点(不使用函数的返回值),还可以考虑通过引用一直向下传递向量,然后仅在顶层返回它(拆分内部来自返回向量的公共递归函数)

标签: c++ recursion quadtree


【解决方案1】:

在您的递归函数std::vector&lt;PTR&gt; Tree::retrieveObjects(PTR p, std::vector&lt;PTR&gt; relevantObjects) 中,您通过值传递参数relevantObjects;每次调用nodes[quadrant]-&gt;retrieveObjects(p, relevantObjects),都会复制一个向量relevantObjects,然后函数对这个副本进行操作。

在你的函数中,你没有使用[quadrant]-&gt;retrieveObjects(p, relevantObjects)的结果,这样relevantObjects的各个副本上的操作就会丢失;在执行relevantObjects.insert(relevantObjects.end(), storedObjects.begin(), storedObjects.end()); 后,您的函数将向relevantObjects 返回第一个输入的副本。

要解决这个问题,只需将参数relevantObjects 设置为“引用调用”,即将您的签名更改为std::vector&lt;PTR&gt; Tree::retrieveObjects(PTR p, std::vector&lt;PTR&gt; &amp;relevantObjects),它应该可以工作。

BTW:如果通过引用传递向量,则不需要返回结果;像void Tree::retrieveObjects(PTR p, std::vector&lt;PTR&gt; &amp;relevantObjects) 这样的签名就足够了。

【讨论】:

  • 谢谢!这太明显了,但我错过了。
猜你喜欢
  • 2020-04-08
  • 1970-01-01
  • 2014-01-02
  • 2021-07-03
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多