[英]BOOST BGL edge index probleme when copying graph or agrument passing probleme
我在類型的提升圖中使用邊緣時遇到問題:
adjacency_list < listS, vecS, undirectedS, mes_noeuds, mes_arcs > graph_t;
“ mes_arcs”由一些參數組成,例如:
struct mes_arcs {
int idarc;
};
創建邊緣時,我將每個邊緣的edge_descriptor
存儲在向量中。 每個邊緣描述符存儲在我通過“ mes_arcs”給邊緣的idarc
位置。
我聲明了一個包含要傳遞給函數的數據的結構:
struct data_creat_graph {
graph_t g_new;
std::vector<edge_descriptor>old_v_edges;
std::vector<edge_descriptor>new_v_edges;
std::vector<int> node_to_del;
std::vector<int> edge_to_del;
};
該函數看起來像:
creat_new_graph( data_creat_graph &dcg){
graph_t g
std_vector new_edge;
edge_descriptor e_d;
...
//create the new graph
e_d = add_edge(v1,v2,g).first;
new_edge[ind]= edge_descriptor;
g[e_d].idarc=ind;
...
//populate the struct
dcg.g_new=g;
dcg.new_v_edge=new_edge;
}
我的問題是,當我在函數中查看值dcg.g_new[dcg.new_v_edge[..]].idarc
(通過寫入調試文件),我的值為“ idarc
”,但是當我嘗試使用時該函數之外的向量idarc的值完全錯誤。
所以我想知道這是否是將參數傳遞給函數的方式的問題,或者是有關通過使用dcg.g_new=g
復制圖形時使用boost edge index或類似的問題?
我試圖找到關於stackoverflow的答案,但是每個人都在按需使用BOOST,因此很難找到答案。
預先感謝您花時間閱讀我的問題。
對於listS
邊緣容器選擇器(您使用的),頂點描述符實際上是對圖的邊緣容器(實際上是每個頂點的外邊緣)的迭代器。
如果復制圖形,則不能使用源中的頂點描述符,因為已將邊緣容器復制到其中,因此描述符不同。
總而言之,您似乎想要在副本之間“共享”(相同)唯一的edge-id。 這就是通常使用捆綁屬性( mes_arcs
)的目的。
當您在此處復制圖表時:
dcg.g_new=g;
捆綁包將被很好地復制。 只是,當您想通過ID查找合適的邊緣時,就必須使用例如
es = edges(g_new);
match = std::find_if(es.first, es.second, [](mes_arcs const& a) { return a.id_arc == 42; });
為了使反向查找更加友好,您可以構建地圖:
map<int, edge_descriptor> rlookup;
for(std::tie(f,l) = edges(g_new); f!=l; ++f)
rlookup[g_new[f].id_arc] = f;
或者,您可以使用“外部”屬性映射。 在這種情況下,可以調整Boost Bimap,以便您可以雙向查找。 (我已經給出了一些示例,這些示例適用於將Boost Bimap用作Boost圖形屬性映射,您應該可以在SO上找到它)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.