我目前正在为 C++ 开发一个图形库,现在卡在了运行时调试模式下出现断言错误的地方。我还在这里查看了关于 SO 的其他一些问题,但没有一个问题和答案能引导我找到解决方案。在阅读了一些论坛之后,我的印象是发生此错误是因为一旦矢量内容发生更改,迭代器就会变得无效。(例如使用时erase()
)但是正如您在我的代码中看到的那样,我没有修改向量,只是迭代。
错误在我用 标记的行中//ASSERTION
。奇怪的是,neighbor_it
它没有指向 ) 中的第一个对象,(*vertex_it)->neighbors(
而是指向0xfeeefeee
. 通过代码进行调试时,我可以清楚地看到邻居向量至少包含一项。不应该neighbor_it
指向这个向量中的第一个对象吗?
更多信息:m_vertices
是图中所有顶点的向量,并vertex::neighbors()
返回边向量(具有指向邻居/目标顶点的指针)。在这种方法中,我想删除所有指向某个顶点的边。如果找到并删除了相应的边,则返回 true,如果没有指向 的边,则返回 false p_vertex
。
bool graph::remove_edges_pointing_to( vertex* p_vertex )
{
bool res = false;
std::vector<vertex*>::iterator vertex_it = m_vertices.begin();
// iterate through all vertices
while( vertex_it != m_vertices.end() )
{
// iterator on first element of neighbors of vertex
std::vector<edge*>::iterator neighbor_it = (*vertex_it)->neighbors().begin();
// iterate through all successors of each vertex
while( neighbor_it != (*vertex_it)->neighbors().end() ) //ASSERTION
{
if( (*neighbor_it)->dest() == p_vertex )
{
if( (*vertex_it)->remove_edge( *neighbor_it ) )
{
res = true;
}
}
neighbor_it++;
}
vertex_it++;
}
return res;
}
编辑:(解决方案)
好的,这是我的新代码,它可以正常工作。remove_edge()
现在返回一个迭代器,指向它从中删除边的向量中的下一个对象。此外,neighbors()
现在返回对相应向量的引用。
bool graph::remove_edges_pointing_to( vertex* p_vertex )
{
bool res = false;
std::vector<vertex*>::iterator vertex_it = m_vertices.begin();
// iterate through all vertices
while( vertex_it != m_vertices.end() )
{
// iterator on first element of neighbors of vertex
std::vector<edge*>::iterator neighbor_it = (*vertex_it)->neighbors().begin();
// iterate through all successors of each vertex
while( neighbor_it != (*vertex_it)->neighbors().end() )
{
if( (*neighbor_it)->dest() == p_vertex )
{
neighbor_it = (*vertex_it)->remove_edge( *neighbor_it );
res = true;
}
else
{
neighbor_it++;
}
}
vertex_it++;
}
return res;
}
再次感谢您的回答!:)