【问题标题】:c++ recursive call not pushing item to vectorc ++递归调用不将项目推送到向量
【发布时间】:2012-02-24 14:38:26
【问题描述】:

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

我现在感觉很紧张,因为我认为我理解尝试在递归调用中推送到向量的问题,但我现在遇到了类似函数的问题。 这是函数的代码:

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 作为参数。已知射线与 TriangleDynamic 对象相交,但如果三角形不是“最低级别”三角形,则该函数会查看三角形 subTriangles 以查找哪个 subTriangle 也与射线相交(其中一个将按设计相交) .这是递归调用发生的地方,只有到达最低级别的三角形时,才会将光线推送到称为光线的向量,它是 TriangleDynamic 的成员数据。但是我又一次丢失了数据。有没有办法做到这一点?我不敢相信我之前的问题得到了如此快速和轻松的回答,我想我会再试一次!谢谢!

【问题讨论】:

  • 你的光线矢量在哪里?
  • 在 TriangleDynamic 作为成员数据。
  • 我最初发布后添加了它,但它是一个包含 Ray 对象的向量。
  • 这里是move std::move 吗?显示rayPushBack 函数。方法签名在 C++ 中很重要。
  • 'move' 是 'std::move',rayPushBack 函数的代码是 'void RayPushBack(Ray &ray) {rays.push_back(ray) ;}'

标签: c++ recursion vector


【解决方案1】:
getSubTriangle(ctr).collectRayRecursive(ray, binSize, radius, org);

您的向量存在于TriangleDynamic [如您所说],但是您的递归调用每次都在TriangleDynamic 的不同实例上工作,因此第一个递归调用的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) 中的向量中,它不会将其传递给 triangle_(n-2) ... 它不会将其传递给 triangle_1 - 您希望在其中看到最终结果结果。

【讨论】:

  • 谢谢,我想我明白了。关于你的回答,我有几个问题。当我复制向量时,会在更高级别的三角形中创建另一个射线向量吗?我只想将光线存储在最低级别。如果您需要查看更多代码,请告诉我。感谢您的帮助!
  • @user1216527:如果您的向量实际上是在三角形上分配的[作为值而不是通过引用]:您必须将getSubTriangle() 存储在一个临时变量中[让它成为temp] 和每次递归调用后,将temp.raysVector [在此处补名] 复制到this.raysVector。它将使向量从最深层次冒泡到第一层次。
  • 嗯...我似乎仍然有问题。我知道我已经到达三角形的最低水平,并且我知道我已经推动了一条射线。但是,当我在递归调用之后立即创建 getSubTriangle(ctr) 的临时变量时,光线向量为空(没有可复制的内容)。感谢您的耐心等待,有什么想法吗?
  • @user1216527:创建临时变量[让它成为temp] 递归调用之前,然后调用:temp.collectRayRecursive(...)。递归调用后,将vectortemp收集到this
  • 好的。所以,在递归调用之前,我将 temp 设置为 getSubTriangle(ctr),然后在递归调用之后,我执行此操作 rays.resize(temp.rays.size());,然后执行此操作 copy(temp.rays.begin(), temp.rays.end(), rays.begin()); 仍然没有任何东西永久放入向量中。我还是没有抓住重点吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
相关资源
最近更新 更多