std :: vector <class * =“”>没有正确构造复制</class>

时间:2013-04-08 04:14:39

标签: c++ c++11 std stdvector

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

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*>的正确方法是什么,这样我才能得到理想的行为?

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:5)

particle.setNbh(nbh);

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

for (auto& particle : particles)