2014-09-30 151 views
-1

我需要能夠爲給定圖形中的每個頂點存儲圖形類型樹。我正在嘗試使用boost::ptr_map<vertex_desc, Tree> DESC,其中Tree是一個鄰接列表圖類型。在我創建樹對象desc並添加我想要的頂點之後,我嘗試將desc存儲到像DESC.insert(std::make_pair(*vi.first, desc))那樣的映射中,但編譯器不允許它。如果我 做DESC[*vi.first] = desc編譯器不會抱怨,但在此之後,我嘗試使用地圖時遇到非常奇怪的行爲。我應該使用另一種方式來存儲Tree對象嗎?BGL:將對象映射到圖形

+0

從我發現我明白'DESC [* vi.first] = desc'是一個非常錯誤的方式存儲對象到'std :: map'(因爲'boost :: ptr_map'是一個包裝的'使用指針的std :: map')。您必須使用'new'運算符或類似'boost :: ptr_map_insert'函數來處理插入。但是我仍然發現使用ptr_map指向'boost :: adjacency_list'圖形是一項非常困難的任務。 – LetsPlayYahtzee 2014-10-01 16:53:15

回答

1

您必須小心使用vertex_descriptor以外的對象。從docs page中查看不同容器選擇的迭代器/描述符穩定性/失效表。如果您希望頂點描述符始終有效(除非被刪除),則需要使用boost::listS作爲VertexList參數。這就是說,如果你想要任何關聯到圖頂點,你應該真的把它放到頂點屬性中,特別是對於捆綁屬性。但是如果你不能修改它,那麼你應該照我說的去做,也就是說,確保描述符在圖操作中保持有效。

+0

我終於改變了我的實現,因爲使用boost :: pt_map搞砸了一切,關於你在地圖中存儲什麼類型或數據結構的規則非常嚴格,我必須非常小心地恢復樹並編輯例如,當我試圖恢復一棵樹時,每隔一個指向指向我編輯的樹的同一範圍內的樹的其他指針,所以現在我不使用這些指針,而是使用捆綁屬性將每棵樹存儲在頂點中(如您所建議的那樣)。這是一種非一般的方法,但至少我能夠對算法進行處理並測試它的執行時間。謝謝你的迴應 – LetsPlayYahtzee 2014-10-01 16:45:19