boost :: edge导致段错误

bgs*_*ler 6 c++ boost boost-graph

我正在尝试使用boost图库,当我尝试使用boost :: edge()时,我遇到了段错误.完整的代码可以在这里找到,但是我在这里制作了一个具有相同问题的最小程序(我用"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;
}
Run Code Online (Sandbox Code Playgroud)

如果我取消注释add_edge,remove_edge行,则不会发生段错误,程序会打印出预期的

G does not have an edge 1->3
Run Code Online (Sandbox Code Playgroud)

但有没有办法避免这样的hackery?谢谢!

Raf*_*ffi 1

显然,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);
Run Code Online (Sandbox Code Playgroud)