Boost Graph中adjacency_iterator转vertex_iterator清理邻接点边问题
Boost Graph库邻接点清空边问题解决方案
核心错误原因
你对参数类型的理解存在偏差:clear_vertex 函数要求传入的第一个参数是 vertex_descriptor 顶点描述符,而非vertex_iterator。adjacency_iterator 解引用后(即代码中的*v)得到的本身就是合法的vertex_descriptor,不需要做任何迭代器类型转换。
你遇到的删除异常问题,本质是遍历邻接迭代器的过程中直接修改图结构,导致adjacency_iterator失效:调用clear_vertex会同步修改图的邻接表结构,正在遍历的迭代器会直接变成非法状态,继续遍历就会出现漏删、未定义行为等问题。
正确实现方案
先把所有邻接点的顶点描述符收集到临时容器中,再批量执行清空操作,规避迭代器失效问题:
// 1. 先收集所有邻接点,可同时完成顶点属性修改 std::vector<Graph::vertex_descriptor> adj_list; Graph::adjacency_iterator v, vend; for (boost::tie(v, vend) = neighbours; v != vend; ++v) { auto adj_v = *v; // 这里插入修改邻接点属性的代码 adj_list.push_back(adj_v); } // 2. 批量清空邻接点的边 for (auto adj_v : adj_list) { clear_vertex(adj_v, g2); }
内容的提问来源于stack exchange,提问作者Giacomo
相关产品推荐
相关产品推荐

