c++递归调用不将项目推送到 vector

标签 c++ recursion vector

几天前,我问了一个与我将要问的关于递归的问题非常相似的问题。这是旧问题的链接:C++ vector loses data in recursive function

我现在感觉很紧张,因为我认为我理解在递归调用中尝试推送到 vector 的问题,但我现在遇到类似功能的问题。 下面是该函数的一些代码:

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;
        }
    }

}

该函数是 TriangleDynamic 类的一部分,以 Ray 作为参数。已知 Ray 与 TriangleDynamic 对象相交,但如果三角形不是“最低级别”三角形,则该函数会查看三角形 subTriangles 以查找哪个 subTriangle 也与 Ray 相交(一个将被设计相交) .这是递归调用发生的地方,只有到达最低级别的三角形时,才会将射线推到称为射线的 vector ,该 vector 是 TriangleDynamic 的成员数据。但是我又一次丢失了数据。有什么办法吗?我不敢相信我之前的问题得到了这么快和这么容易的回答,我想我会再试一次!谢谢!

最佳答案

getSubTriangle(ctr).collectRayRecursive(ray, binSize, radius, org);

你的 vector 存在于 TriangleDynamic [正如你所说],但是你的递归调用每次都在 TriangleDynamic 的不同实例上工作,所以 vector 第一次递归调用的 vector 与第二次递归调用的 vector 不同,后者与第三次递归调用不同.... [好吧,我真的不能确定,因为我需要更多代码,但我认为是这样]。

您必须确保在递归调用之后,将位于 getSubTriangle() 生成的三角形中的 vector 复制到 this.

编辑:查看递归调用的“堆栈跟踪”:
调用堆栈可能看起来像这样:

|triangle_1.collectRayRecursive()|
---------------------------------

通过递归调用你得到[注意 triangle_1, triangle_2 是不同的对象]

|triangle_2.collectRayRecursive()|
|triangle_1.collectRayRecursive()|
---------------------------------

等等:...

|triangle_n.collectRayRecursive()|
....
|triangle_2.collectRayRecursive()|
|triangle_1.collectRayRecursive()|
---------------------------------

现在,您修改位于对象 triangle_n [最深的递归调用] 中的 vector,但不修改另一个中的 vector三角形。
当你从递归中返回时,弹出头部,即triangle_n - 没有复制vector
因此 - 新信息没有添加到 triangle_(n-1) 中的 vector ,它不会传递给 triangle_(n-2) ... 不会将其传递给 triangle_1 - 您希望在其中看到最终结果。

关于c++递归调用不将项目推送到 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9432499/

相关文章:

c++ - 堆栈内存/堆栈

c++ - 将 C/C++ dll 头文件转换为 Delphi 的最佳资源?

c++ - 三十部分库中的线程安全

linux - 最大堆栈大小使用

algorithm - 检查线段是否与从特定点绘制的垂直线相交?

c++ - 为什么 std::vector::front 有两个定义? (C++)

c++ - C++中的指针有什么用?

c++ - 为什么 std::set/std::map 和 std::unordered_set/std::unordered_map 没有 std::erase 重载但有 std::erase_if ?

java - 回文程序,无法终止循环,欧拉计划 #4

javascript - 遍历嵌套数组,通过id找到具体的叶子节点,并移除