6

我正在尝试使用 boost 图形库,当我尝试使用 boost::edge() 时出现段错误。完整的代码可在此处获得,但在这里我制作了一个具有相同问题的最小程序(我正在使用“g++ minimum.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

但是有没有办法避免这种黑客行为?谢谢!

4

1 回答 1

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);
于 2013-09-16T14:29:29.313 回答