2013-04-08 23 views
1

我有一类粒子像这样,<Class *>没有得到复制构造的std ::矢量正确

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); 
    } 
} 

事情是,当我更新邻居的机智h此功能,nbh_成员没有正确更新,我测试它打印每个粒子的大小getNbh()

哪个是复制构建的正确方法std::vector<Particle*>所以我可以得到想要的行为?

+0

整个执行[这里](http://dpaste.org/voLsx/) – 2013-04-08 04:18:39

+0

nbh_是指针粒子和updateNeighbors的矢量由值取粒子的载体。它将如何工作? updateNeighbors如何访问nbh_? – 2013-04-08 04:20:10

+0

我把它作为参考,它的目的是更新粒子的向量中的每个粒子的nbh_ – 2013-04-08 04:23:20

回答

5

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

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

auto&&在型扣上下文中,这意味着auto&&或者是一个右值引用,一个const参考,或正常参照,这取决于该变量由初始化使用&&。当你不想去考虑时,这是一种体面的“默认”方式来迭代容器。

+0

谁值得接受的答案你或@Thrustmaster ?,我看到你的答案更好地解释,但他评论了一个首先工作答案。 – 2013-04-08 04:31:59

+0

@OscarDavidArbeláez给予Thrust :) – Yakk 2013-04-08 04:37:09

+0

@Yakk哈哈,它很好,真的!接受的答案应该是精确的并且详细阐述解释(像你的),而不管谁先来。 :) – SuperSaiyan 2013-04-08 04:42:31

5

particle.setNbh(nbh); 

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

for (auto& particle : particles) 
相关问题