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

particle.setNbh(nbh);

繰り返しながら、実際nbh(..)には要素の「コピー」を設定しています。参照を変更する予定がある場合は、反復中に実際に参照を使用する必要があります。使用する:

for (auto& particle : particles)
于 2013-04-08T04:31:10.797 に答える
5

両方のループでにfor ( auto置き換えます。for ( auto&&

Particleベクターからそれぞれのローカルコピーを作成していparticlesますが、そうするつもりはないことを強く期待しています。

auto&&&&つまり、変数が初期化されるものに応じてauto&&、右辺値参照、参照、または通常の参照のいずれかになります。constこれは、コンテナについて考えたくない場合に、コンテナを反復処理する適切な「デフォルト」の方法です。

于 2013-04-08T04:28:24.253 に答える