我有一个循环删除邻接列表中的Graph边缘。它看起来像这样:
void Graph::removeEdge(int a, int b)
{
vector<int>::iterator it = adjList[a].begin();
while(*it != b) it++;
adjList[a].erase(it);
it = adjList[b].begin();
while(*it != a) it++;
adjList[b].erase(it);
}
几次尝试后,我收到Segmentation fault: 11
错误。这是由访问*it
引起的。可能是什么原因,如何解决这个问题?
更多信息:
// This is my structure
vector<int> *adjList;
Graph::Graph(int V)
{
this->V = V;
adjList = new vector<int>[V];
clear();
}
答案 0 :(得分:4)
这里可能发生的事情是: 1.陷入无限循环(在你的情况下:段错误) 2.擦除不存在的迭代器(segfault)。
要纠正这些,请注意:
而不是:
while(*it != b) it++;
adjList[a].erase(it);
做的:
while(it != adjList[a].end() && *it != b) it++;
if (it != adjList[a].end()) adjList[a].erase(it);
如果在到达b
时未找到元素end
,则结束循环,if
子句将确保删除现有的迭代器。