2013-03-15 88 views
6

我试图使用boost图库,并且当我尝试使用boost :: edge()时出现段错误。完整的代码可以here,但在这里,我做了一个最小的程序有同样的问题(我用“G ++ minimal.cpp”编译):boost :: edge引起段错误

#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 

但有没有办法避免这种骇客?谢谢!

+0

这看起来很像一个错误。如果您无法在Stackoverflow上获得正确的响应,您可能需要将其放在[Boost-Devel邮件列表](http://news.gmane.org/gmane.comp.lib.boost.devel)上。 – Mankarse 2013-03-15 02:34:42

回答

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); 
+0

我很欣赏这种关注,但是这是在6个月前发布的。我不再积极参与这个项目。另外,从上面的例子中还不清楚,但我认为它一定比您描述的要复杂一点。我不认为调用add_edge(1,3,G)会添加顶点0和4. – bgschiller 2013-09-16 19:21:58

+0

实际上,我用调试器跟踪了指令,并且惊讶地发现“if(x> = num_vertices(g_))g_ .m_vertices.resize(x + 1);“ (boost \ graph \ detail \ adjacency_list.hpp,第2186行,boost 1.50) – Raffi 2013-09-16 19:25:57

+0

无论如何,任何这类问题都值得回答。 – Raffi 2013-09-16 19:26:41