我有一个像这样的类粒子,
class Particle
{
public:
std::vector<Particle*> getNbh () const;
void setNbh (const std::vector<Particle*>&);
private:
std::vector<Particle*> nbh_;
};
并且实现了函数Particle::setNbh(const std::vector<Particle*>&)
,
void Particle::setNbh (const std::vector<Particle*>& nbh)
{
nbh_ = nbh;
}
然后有一个非成员函数updateNeighbors (std::vector<Particle>& particles, double cutoff)
void updateNeighbors (std::vector<Particle>& particles, double cutoff)
{
for (auto particle : particles)
{
auto nbh = std::vector<Particle*>();
for (auto other : particles)
if (&particle != &other
&& norm(particle.getPosition() - other.getPosition()) < cutoff)
nbh.push_back(&other);
particle.setNbh(nbh);
}
}
当我用这个函数更新邻居时,nbh_
成员没有正确更新,我测试它为每个粒子打印getNbh()
的大小。
复制构建std::vector<Particle*>
的正确方法是什么,这样我才能得到理想的行为?
答案 0 :(得分:5)
在两个循环中将for ( auto
替换为for ( auto&&
。
您正在从Particle
向量创建每个particles
的本地副本,我强烈希望您不打算这样做。
auto&&
在类型扣除上下文中使用&&
,这意味着auto&&
可以是右值引用,const
引用或普通引用,具体取决于变量由初始化。当你不想考虑它时,它是一种体面的“默认”迭代容器的方式。
答案 1 :(得分:5)
在
particle.setNbh(nbh);
在迭代时,您实际上是在元素的“副本”上设置nbh(..)
。如果您计划修改它们,则实际上应该在迭代时使用引用。使用:
for (auto& particle : particles)