四叉树递归检索

时间:2017-01-12 14:24:36

标签: c++ recursion quadtree

我正在创建一个四叉树,我在检索功能方面遇到了一些麻烦。此函数向下到存储对象的节点,并将对象放在名为relatedObjects的向量中。 在此之后,它返回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; }

1 个答案:

答案 0 :(得分:0)

在递归函数<div class="alert alert-success fade in"> <a href="#" class="close" data-dismiss="alert" aria-label="close">×</a> <p><strong>Ey!</strong></p> <? $getusersquery=mysqli_query($link,"Select * from 360tery where userid='$otherusersid' LIMIT 4 "); while($row5=mysqli_fetch_array($getusersquery)) { $userusername=$row5['username']; $useremail=$row5['Email']; $userprofilepicture=$row5['Profilepicture']; $userfirstname=$row5['firstname']; $userlastname=$row5['lastname']; $user_profile_pic='/users/'.$userusername.'/profilepicture/'.$userprofilepicture; $userphoto = "<img src='.$user_profile_pic' id='avatarimg' class='img-circle' height='85' width='85'> <br> <br>"; echo'<div class="well">'; echo '<p><strong> '.$userfirstname.' '.$userlastname.'</strong> </p>'; echo'<p>'.$userusername.'</p>'; echo $userphoto; echo '<form action="" method="post" enctype="multipart/form-data"> '; echo '<input type="submit" name="addfriend" value="Add Friend" class="btn btn-warning btn-xs">'; echo '</div>'; } if(isset($_POST['addfriend'])) { echo "<script type='text/javascript'>alert('Request sent !');</script>"; } ?> 中,按值传递参数std::vector<PTR> Tree::retrieveObjects(PTR p, std::vector<PTR> relevantObjects);每次调用relevantObjects时,都会生成一个向量nodes[quadrant]->retrieveObjects(p, relevantObjects)的副本,然后该函数会在副本上运行。

在你的函数中,你没有使用relevantObjects的结果,因此[quadrant]->retrieveObjects(p, relevantObjects)的相应副本上的操作会丢失;执行relevantObjects后,您的函数会将第一个输入的副本返回relevantObjects

要解决此问题,只需将参数relevantObjects.insert(relevantObjects.end(), storedObjects.begin(), storedObjects.end());设为“按引用调用”,即将您的签名更改为relevantObjects,它就可以正常工作。

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