C++ c++;递归调用不将项推送到向量
几天前,我问了一个与我将要问的关于递归的问题非常相似的问题。以下是旧问题的链接: 我现在感觉很难理解,因为我想我理解了在递归调用中尝试推送到向量的问题,但是我现在遇到了类似函数的问题。 以下是函数的代码位:C++ c++;递归调用不将项推送到向量,c++,recursion,vector,C++,Recursion,Vector,几天前,我问了一个与我将要问的关于递归的问题非常相似的问题。以下是旧问题的链接: 我现在感觉很难理解,因为我想我理解了在递归调用中尝试推送到向量的问题,但是我现在遇到了类似函数的问题。 以下是函数的代码位: void TriangleDynamic::collectRayRecursive(Ray &ray, double binSize, double radius, Point &org) { if (getLowestLevel()) {
void TriangleDynamic::collectRayRecursive(Ray &ray, double binSize, double radius, Point &org)
{
if (getLowestLevel())
{
//this is where I push the ray.
raysPushBack(move(ray));
}
else
{
bool foundIntersectSub = false;
unsigned int ctr = 0;
while((!foundIntersectSub) && (ctr<=getSubTrianglesSize() - 1 ))
{
if (getSubTriangle(ctr).intersect(ray) )
{
foundIntersectSub = true;
getSubTriangle(ctr).collectRayRecursive(ray, binSize, radius, org);
}
ctr = ctr + 1;
}
}
}
void TriangleDynamic::collectRayRecursive(光线和光线、双箱大小、双半径、点和组织)
{
if(getLowestLevel())
{
//这就是我推雷的地方。
raysPushBack(移动(光线));
}
其他的
{
bool-foundIntersectSub=false;
无符号整数中心=0;
而(!foundIntersectSub)和&(ctr)
您的向量存在于TriangleDynamic
[如您所说],但是您的递归调用每次都在TriangleDynamic
的不同实例上工作,因此第一个递归调用的向量与第二个递归调用的向量不同,这与第三个递归调用不同。。。。[好吧,我不能确定这是真的,因为我需要更多的代码,但我想是这样的]
您必须确保在递归调用之后,将向量
复制到this
,该向量位于getSubTriangle()
生成的三角形中
编辑:查看递归调用的“堆栈跟踪”:
调用堆栈可能如下所示:
|triangle_1.collectRayRecursive()|
---------------------------------
通过调用递归调用,您可以得到[注意,三角形1和三角形2是不同的对象]
|triangle_2.collectRayRecursive()|
|triangle_1.collectRayRecursive()|
---------------------------------
等等:
|triangle_n.collectRayRecursive()|
....
|triangle_2.collectRayRecursive()|
|triangle_1.collectRayRecursive()|
---------------------------------
现在,您可以修改对象三角形中的向量
[最深的递归调用],但不能修改其他三角形中的向量。
从递归返回时,弹出头部,即三角形
——而不复制向量
。
结果-新信息未添加到三角形(n-1)
中的向量,该向量将不会传递给三角形(n-2)
…它不会传递给triangle\u 1
-您希望看到最终结果的地方。您的光线向量住在哪里?在TriangleDynamic中作为成员数据。我在最初发布后添加了它,但它是一个保存光线对象的向量。这里是move
吗std::move
?显示光线回射功能方法签名在C++中很重要。“移动”是“STD::移动”,而RaySPHUBF函数的代码是“无效的RaySPHeBACK(瑞和Re){射线”。“谢谢,我想我明白了。关于你的答案,我有几个问题。当我复制向量时,会在更高级别的三角形中创建另一个射线向量吗?我只想将射线存储在最低级别。如果你需要查看更多代码,请告诉我。谢谢你的帮助!@user1216527:如果你的向量是真的!”三角形上的d[作为值,而不是通过引用]:您必须将getSubTriangle()
存储在临时变量中[将其设置为temp
]并复制temp.raysVector
[在此处命名]每次递归调用后,它都会使向量从最深层冒泡到第一层。嗯……我似乎仍然有问题。我知道我已经到了三角形的最底层,我知道我推了一条光线。但是当我创建一个临时变量getSubTriangle(ctr)时在递归调用之后,光线向量是空的(无需复制)。感谢您的耐心,有什么想法吗?@user1216527:在递归调用之前创建临时变量[让它成为temp
],然后调用:temp.collectRayRecursive(…)
。在递归调用之后,将向量
从temp
收集到this
中。好的。因此,在递归调用之前,我将temp设置为等于getSubTriangle(ctr)
然后在递归调用之后执行此射线调整大小(temp.rays.size());
然后执行此复制(temp.rays.begin()、temp.rays.end()),rays.begin());
仍然没有任何东西被永久地放在向量中。我仍然没有抓住要点吗?
|triangle_n.collectRayRecursive()|
....
|triangle_2.collectRayRecursive()|
|triangle_1.collectRayRecursive()|
---------------------------------