我有一个这样的Class粒子,

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*>的正确方法是哪种,这样我可以得到所需的行为?

最佳答案

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

您正在从Particle vector 创建每个particles的本地副本,我强烈希望您不打算这样做。
auto&&在类型推导上下文中使用&&,这意味着auto&&可以是右值引用,const引用或常规引用,具体取决于初始化变量的方式。当您不想考虑容器时,这是一种遍历容器的不错的“默认”方法。

关于c++ - std::vector <Class *>不能正确构造拷贝,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15871135/

10-11 15:29