You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:15:07