[問題] 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