std向量的先前内容在迭代过程中被替换

时间:2018-12-01 16:43:06

标签: c++ stdvector

我正在编写一个程序,该程序应该在图形中找到一个有根的生成树,以及将该根与该生成树中的其他顶点连接起来的所有唯一路径。我正在尝试仅使用一个功能执行两项操作:

void Spanning_tree_finder(){

    int * v=Add_edges(s1); int control=0; int size;

    for(int i=0; i<_g.GetE(); i++){

        if(control==0 && v[i]==1) {

        s1[i]=1; control=1; 
        size=_v.size(); 
            for(int j=0; j<size; j++){

                if(_v[j].Getv2()==_g.GetEdge1(i)){
                Path pnew=_v[j];

                pnew.Setv2(_g.GetEdge2(i));
                pnew.Setp(i); 
                _v.push_back(pnew); 
                };

                if(_v[j].Getv2()==_g.GetEdge2(i)){
                Path pnew=_v[j];
                pnew.Setv2(_g.GetEdge1(i));
                pnew.Setp(i);
                _v.push_back(pnew); 
                };
            };

        Spanning_tree_finder();

        };
    };

    return;
};

出于上下文的考虑,该函数迭代地生成生成树,在生成过程的最后,该树包含在s1中,方法是获取也包含在s1中的树,搜索所有使用函数Add_edges相邻的边,从而将相邻边之一添加到前一棵树中。然后再次调用该函数(请注意,Add_EdgesSpanning_tree_finder都是类的一部分,而s1是此类的私有成员)。在此过程中,该函数还通过搜索将根与新引入的边的非松散顶点连接起来的先前路径并将该路径添加到该路径,来构造将根与与新引入的相邻边相关联的松散顶点连接起来的路径。新引进的优势。路径全部存储在路径向量_v中。我知道这个解释有点令人费解,但我希望这很清楚。

但是,此函数存在问题,因为似乎在每次迭代中,_v中包含的所有路径都被当前迭代中获得的路径替换。 _v.size()包含相同路径的_v个副本,而不是获得_v.size()个不同的路径,并且在每次迭代时都有效。我不明白为什么会发生这种情况,因为在我看来该函数从不访问以前添加的元素。 希望我所解释的问题很清楚,并且很高兴提供进一步的澄清。

编辑:更具体地说,我认为有问题的代码行

for(int j=0; j<size; j++){

            if(_v[j].Getv2()==_g.GetEdge1(i)){
            Path pnew=_v[j];

            pnew.Setv2(_g.GetEdge2(i));
            pnew.Setp(i); 
            _v.push_back(pnew); 
            };

            if(_v[j].Getv2()==_g.GetEdge2(i)){
            Path pnew=_v[j];
            pnew.Setv2(_g.GetEdge1(i));
            pnew.Setp(i);
            _v.push_back(pnew); 
            };
};

问题的核心是如何将pnew插入_v中。代替在向量的末尾添加元素pnew_v中的所有元素都用pnew

代替

1 个答案:

答案 0 :(得分:0)

肯定听起来像_v中的对象可以通过指针访问某些数据,并且您正在通过修改您认为是新的对象来修改_v中已经存在的对象。

水晶球说Path pnew = _v[j]复制一个现有的Path对象,该对象包含一些指向数据的指针。指针将被复制到新对象,但指向相同的位置,因此Setv2Setp之类的修饰符将更改所有指针的数据。

尝试通过用其他东西(例如向量)替换显式指针来修复Path,或者编写适当的复制构造函数和赋值运算符来正确处理这些指针字段(通过分配新内存并复制内容)。