我正在创建一个四叉树,我在检索功能方面遇到了一些麻烦。此函数向下到存储对象的节点,并将对象放在名为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; }
答案 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)
这样的签名就足够了。