1

我有一个像这样的类粒子,

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*>以便我可以获得所需的行为?

4

2 回答 2

5

在两个循环中替换for ( auto为。for ( auto&&

Particle您正在从您的矢量创建每个的本地副本particles,我强烈希望您不打算这样做。

auto&&在类型推导上下文中使用&&,这意味着它auto&&是右值引用、const引用或普通引用,具体取决于变量的初始化对象。当您不想考虑它时,这是一种体面的“默认”方式来迭代容器。

于 2013-04-08T04:28:24.253 回答
5

particle.setNbh(nbh);

您实际上是nbh(..)在迭代时设置元素的“副本”。如果您打算修改它们,则实际上应该在迭代时使用引用。采用:

for (auto& particle : particles)
于 2013-04-08T04:31:10.797 回答