1

我的编码的相关(我认为)行如下。这意味着有一个集群列表。其中一个,base,将吸收另一个(aborbed)。aborbed集群应该从list.

我遇到的第一个问题是,在循环关闭后,我需要在集群baseabsorbed集群中执行其他操作。while从我的搜索中,我找到了= &(*li)这些东西。我的理解是,我得到了一个指向元素li指向的地址的指针,尽管我做不到 absorbed = li,因为一个是迭代器,另一个是(简单?) ponter。我很感激对此的一些解释。

现在,更大的问题是我在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 回答