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