我编码的相关(我认为)行如下。
意思是有一个集群列表。
其中一个base
将吸收另一个(aborbed
)。
aborbed
群集应从list
删除。
我遇到的第一个问题是,在base
周期关闭后,我需要在absorbed
和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();
};
答案 0 :(得分: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
会收到无效的地址。