1

私のコーディングの関連する(私が思う)行は以下のとおりです。つまり、クラスターのリストがあるということです。そのうちの 1 つ は、base別のもの ( ) を吸収しaborbedます。aborbedクラスタは から消去する必要がありますlist

私が遭遇した最初の問題は、サイクルが終了した後、baseabsorbedクラスターの両方で他の操作を実行する必要があることでした。while私の検索から、私は= &(*li)ものを見つけました。私が理解しているのは、要素がli指す アドレスへのポインターを取得することabsorbed = liです. これについての説明をいただければ幸いです。

c->getPoints();さて、より大きな問題は、メソッドの行でセメンテーション違反が発生するjoinCluster() ことです。何が間違っていますか? 私は何をすべきですか?

Linux x86_64 で g++ (GCC) 4.5.2 を使用しています。

Cluster * base;
Cluster * absorbed;

list<Cluster>::iterator li = clusters.begin(); 
while ( li != clusters.end() ) {   
    if (li->getId() == p2) {
        absorbed = &(*li);
        li = clusters.erase(li);
    } else if (li->getId() == p1) { 
        base = &(*li);
    }
++li;
}

base->joinCluster(absorbed);


void Cluster::joinCluster(Cluster * c)
{
    set<unsigned int> pts = c->getPoints(); 
}

set<unsigned int> Cluster::getPoints()
{
return points;
}

class Cluster {
    private:
    std::set<unsigned int> points;
    public:
    std::set<unsigned int> getPoints();
};
4

1 に答える 1

4
list<Cluster>::iterator li = clusters.begin(); 
while ( li != clusters.end() ) {   
    if (li->getId() == p2) {
        absorbed = &(*li);
        li = clusters.erase(li);
    } else if (li->getId() == p1) { 
        base = &(*li);
    }
++li;   // <----  Don't increment when you already deleted.
}

リストの最後の要素を削除すると、はにliなりcluster.end()ます。それからあなたはそれを再びインクリメントしてブームします、あなたは範囲外です。ブロック++liに入る必要があります。else

liまた、コンテナから消去するとabsorbed、無効なアドレスが保持されることに注意してください。

于 2012-04-15T22:08:53.927 に答える