我正在尝试使用boost图库,当我尝试使用boost :: edge()时,我遇到了段错误。完整的代码可用here,但是我在这里制作了一个具有相同问题的最小程序(我正在用“g ++ minimal.cpp”进行编译):
#include<stdio.h>
#include<boost/graph/adjacency_list.hpp>
using namespace boost;
using namespace std;
typedef adjacency_list<> graph_t;
typedef graph_traits<graph_t>::edge_descriptor edge_descriptor;
int main(){
graph_t G;
//add_edge(1,3,G);
//remove_edge(1,3,G);
pair<edge_descriptor, bool> res = edge(1,3,G);
printf("G does %shave an edge 1->3\n", res.second ? "" : "not ");
return 0;
}
如果我取消注释add_edge,remove_edge行,则不会发生段错误,程序会打印出预期的
G does not have an edge 1->3
但有没有办法避免这样的hackery?谢谢!
答案 0 :(得分:0)
显然,如果需要,add_edge(1,3,G)
调用会向图表添加顶点。在那种情况下你的第一个电话。然后它将顶点1的边添加到顶点3.注意,在此调用之后,顶点的数量是4,因为顶点然后从0索引到3。
对remove_edge(1,3,G)
的后续调用会删除刚添加的边,但会保留顶点数不变。
另一方面,对edge(1,3,G)
的调用不会向图形添加任何顶点,如果顶点1和3连接与否,则返回中的布尔值表示状态。您有一个访问冲突是删除add_edge
,因为索引1和3的顶点不存在。
您只需使用所需数量的顶点初始化图形:
graph_t G(4);