四叉树递归检索
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)
这样的签名就足够了。
我正在创建一个四叉树,但在使用检索函数时遇到了一些麻烦。这个函数深入到存储对象的节点,并将对象放入一个名为 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());
.
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)
这样的签名就足够了。