[问题] boost中的remove_edge和vector合并使用

楼主: sea010461 (sin of bleed)   2014-08-12 08:23:10
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
Ubuntu 14.04, gcc,
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
STL, boost
问题(Question):
我试着用boost下的graph library来产生一些network的图。
对于一个graph object, g, 我可以正常的使用remove_edge这个函数。
remove_edge(0,1,g)会把所有连在0,1上的线去掉。
remove_edge(edge_descriptor,g)会把g里面的某一个边去掉。
这个是我想要用的功能,因为他可以个别去掉边。
因为我需要有很多个 network要处理,我希望把他放在
vector container里面方便操作,可是就出了问题。
如果我把g push_back到 graph_list里面。假设是graph_list[0]。
然后把g的edge_descriptor也push_back到
g对应的edge_list,g_edge_list里面
remove_edge(g_edge_list[0],graph_list[0])
正常运作的话,他应该会把graph_list里的第一个图的第一个边去掉。
gcc -Wall 没有显示问题。
但是一执行到那一行,我就得到
Segmentation fault (core dumped)
以下是我的程式码
程式码(Code):(请善用置底文网页, 记得排版)
https://gist.github.com/YiPingHuang/557754bfd5208bb4c612
补充说明(Supplement):
如果用remove_edge(0,1,graph_list[0])可以正常运作。
为了让他可以正常运作,任何可能可以尝试的建议都很感激!!
谢谢
作者: shadow0326 (非议)   2014-08-12 12:35:00
edge_descriptor invalidate了吧
楼主: sea010461 (sin of bleed)   2014-08-12 13:01:00
是说edge_descriptor是指到g,但是pushback是复制g到graph_list里面,所以edge_descriptor和graph_list不匹配吗?如果是这样我应该去学习哪类方法呢?可以请教一下哪些关键字可以让我去咕狗学习吗?感谢
作者: shadow0326 (非议)   2014-08-12 13:44:00
原本的edge_descriptor可能会在那个图被改变时失效就像iterator会在容器被改变时失效一样每次呼叫add_edge 之前所存的descriptor就失效了 因为图已经改变了用descriptor invalidation去估狗看看吧另外我虽然不熟boost graph 但是我想他一定有办法去iterate一个图的edge的 应该不需要自己存
楼主: sea010461 (sin of bleed)   2014-08-12 14:10:00
感谢!!让我再试看看
作者: shadow0326 (非议)   2014-08-13 13:56:00
只有一个图是指你的sample code的Nl改成1吗?
楼主: sea010461 (sin of bleed)   2014-08-13 14:30:00
不是,就不要放到vector里只有g,一切就正常。
作者: shadow0326 (非议)   2014-08-13 14:42:00
有code可以参考吗?
楼主: sea010461 (sin of bleed)   2014-08-13 14:58:00
gist.github.com/YiPingHuang/7dc7dc7baa38e359a72a太长了省略了前面的http...
作者: shadow0326 (非议)   2014-08-13 15:23:00
噢 我看了一下文件发现add_edge没有失效问题 抱歉误导问题应该是出在push_back时的copy动作没错push_back的意义是复制一份物件 所以原图和容器内的图是不同的实体,descriptor指向原图而非容器内的图http://ideone.com/JKro7u 稍微改一下 你看看行不行
楼主: sea010461 (sin of bleed)   2014-08-13 15:43:00
感谢!的确是可以work,不过我需要vector可以长,这也是为什么我想要用vector装图,看来是我得找个方法一起把图和descriptor整个pushback到vector里。
作者: shadow0326 (非议)   2014-08-13 15:58:00
可以长也没关系 先insert图 再更新容器内那张图不过前提是先reserve足够空间给容器 避免隐性的copy

Links booklink

Contact Us: admin [ a t ] ucptt.com