[問題] boost中的remove_edge和vector合併使用

看板C_and_CPP (C/C++)作者 (sin of bleed)時間11年前 (2014/08/12 08:23), 編輯推噓2(2030)
留言32則, 2人參與, 最新討論串1/1
開發平台(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])可以正常運作。 為了讓他可以正常運作,任何可能可以嘗試的建議都很感激!! 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 128.138.41.112 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1407802992.A.789.html

08/12 12:35, , 1F
edge_descriptor invalidate了吧
08/12 12:35, 1F

08/12 13:01, , 2F
是說edge_descriptor是指到g,但是pushback是複製g到
08/12 13:01, 2F

08/12 13:03, , 3F
graph_list裡面,所以edge_descriptor和graph_list不匹
08/12 13:03, 3F

08/12 13:03, , 4F
配嗎?
08/12 13:03, 4F

08/12 13:06, , 5F
如果是這樣我應該去學習哪類方法呢?可以請教一下哪些
08/12 13:06, 5F

08/12 13:08, , 6F
關鍵字可以讓我去咕狗學習嗎?感謝
08/12 13:08, 6F

08/12 13:44, , 7F
原本的edge_descriptor可能會在那個圖被改變時失效
08/12 13:44, 7F

08/12 13:45, , 8F
就像iterator會在容器被改變時失效一樣
08/12 13:45, 8F

08/12 13:46, , 9F
每次呼叫add_edge 之前所存的descriptor就失效了 因為
08/12 13:46, 9F

08/12 13:46, , 10F
圖已經改變了
08/12 13:46, 10F

08/12 13:50, , 11F
用descriptor invalidation去估狗看看吧
08/12 13:50, 11F

08/12 13:50, , 12F
另外我雖然不熟boost graph 但是我想他一定有辦法去
08/12 13:50, 12F

08/12 13:51, , 13F
iterate一個圖的edge的 應該不需要自己存
08/12 13:51, 13F

08/12 14:10, , 14F
感謝!!讓我再試看看
08/12 14:10, 14F

08/13 13:20, , 15F
我試了如果只有一個圖,remove_edge是可以正常運作的。
08/13 13:20, 15F

08/13 13:21, , 16F
所以我想可能是我在push_back的時候發生了什麼問題。
08/13 13:21, 16F

08/13 13:22, , 17F
如果是add_edge導致descriptor失效應該一個圖也會錯。
08/13 13:22, 17F

08/13 13:56, , 18F
只有一個圖是指你的sample code的Nl改成1嗎?
08/13 13:56, 18F

08/13 14:30, , 19F
不是,就不要放到vector裡只有g,一切就正常。
08/13 14:30, 19F

08/13 14:42, , 20F
有code可以參考嗎?
08/13 14:42, 20F

08/13 14:58, , 21F
gist.github.com/YiPingHuang/7dc7dc7baa38e359a72a
08/13 14:58, 21F

08/13 14:59, , 22F
太長了省略了前面的http...
08/13 14:59, 22F

08/13 15:23, , 23F
噢 我看了一下文件發現add_edge沒有失效問題 抱歉誤導
08/13 15:23, 23F

08/13 15:24, , 24F
問題應該是出在push_back時的copy動作沒錯
08/13 15:24, 24F

08/13 15:24, , 25F
push_back的意義是複製一份物件 所以原圖和容器內的圖
08/13 15:24, 25F

08/13 15:25, , 26F
是不同的實體,descriptor指向原圖而非容器內的圖
08/13 15:25, 26F

08/13 15:32, , 27F
http://ideone.com/JKro7u 稍微改一下 你看看行不行
08/13 15:32, 27F

08/13 15:43, , 28F
感謝!的確是可以work,不過我需要vector可以長,這也
08/13 15:43, 28F

08/13 15:45, , 29F
是為什麼我想要用vector裝圖,看來是我得找個方法一起把
08/13 15:45, 29F

08/13 15:45, , 30F
圖和descriptor整個pushback到vector裡。
08/13 15:45, 30F

08/13 15:58, , 31F
可以長也沒關係 先insert圖 再更新容器內那張圖
08/13 15:58, 31F

08/13 15:59, , 32F
不過前提是先reserve足夠空間給容器 避免隱性的copy
08/13 15:59, 32F
文章代碼(AID): #1JwLvmU9 (C_and_CPP)
文章代碼(AID): #1JwLvmU9 (C_and_CPP)