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()|
---------------------------------