为什么这个赋值运算符不工作?

Why is this assignment operator not working?

提问人:bad_chemist 提问时间:12/18/2021 最后编辑:bad_chemist 更新时间:12/18/2021 访问量:93

问:

我有一个对象向量. 是对象的一个属性。 该对象有 3 个属性:一个 、 一个 cpp 字符串,哪个 .SolventInGridParticleSolventInGridNewGridParticlecoordsvector <int>ptypeorientationint

我想做的是,我想找到一个具有特定坐标的溶剂粒子,并将它们替换为 .我有一个函数可以做一些其他事情,并在一天结束时进行此更改。如果我这样做,它会起作用:SolventInGridto_rotloc_0

...
        for...
            // update position of the solvent particle you displaced during this move 
            int c =0; 
            for (Particle P: NewG.SolventInGrid){
                c++; 
                if (P.coords == to_rot){ 
                     
                    break;
                }

            }
            NewG.SolventInGrid.at(c-1).coords = loc_0; 
            break;
            

        }


    }

    return NewG;
}

但是,如果我这样做:

...
        for ...

            // update position of the solvent particle you displaced during this move 
            int c =0; 
            for (Particle P: NewG.SolventInGrid){
                if (P.coords == to_rot){ 
                    P.coords = loc_0; // this is the assignment statement to the Particle P within NewG.SolventInGrid
                    break;
                }

            }
            
            break;

        }


    }

    return NewG;
}

如果我打印出 NewG.SolventsInGrid 的内容,则矢量的内容没有变化。没有以 loc_0 为坐标的元素。(一开始就没有。

这可能是什么原因造成的?为什么这样的分配是坏的/不正确的?

C++ OOP 变量 stdvector 赋值运算符

评论

2赞 Nathan Pierson 12/18/2021
for(Particle P: NewG.SolventInGrid) P是 中元素的副本。如果你想要一个参考,那就是NewG.SolventInGridfor(Particle& P: ...)
0赞 bad_chemist 12/18/2021
哼。因此,当我使用 for (...: ...) 形式遍历向量时,它总是一个副本?
0赞 Pepijn Kramer 12/18/2021
是的,它将是副本:en.cppreference.com/w/cpp/language/range-for
0赞 Raymond Chen 12/18/2021
如果要迭代引用(而不是副本),请与 & 符号一起使用。for (Particle& P : ...)

答: 暂无答案