Exa*_*Exa 4 c++ iterator stl vector stdvector
我目前正在为C++开发一个图形库,现在卡在运行时调试模式中出现断言错误的位置.我也在这里看了一些关于SO的问题,但没有一个问题和答案引导我找到解决方案.在一些论坛中阅读后,我发现这个错误的发生是因为一旦矢量内容发生变化,迭代器就会失效.(例如在使用时erase())但是正如你在我的代码中看到的那样,我不是在修改向量,只是迭代.
错误出现在我标记的行中//ASSERTION.奇怪的是,neighbor_it它并没有指向第一个对象,(*vertex_it)->neighbors(而是指向0xfeeefeee.通过代码调试时,我可以清楚地看到neighbors-vector包含至少一个项目.不应该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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:(解决方案)
好的,这是我的新代码,它正常工作.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;
}
Run Code Online (Sandbox Code Playgroud)
再次感谢您的回答!:)
gwi*_*rrr 11
我的猜测,鉴于你提供的有限的上下文,是neighbours()返回副本std::vector<edge*>,而不是引用,即std::vector<edge*>&.因此在begin()调用临时对象后,并获得迭代器指向垃圾.