簡體   English   中英

復制圖形或累積傳遞問題時BOOST BGL邊緣索引出現問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM