复制图形或参数传递问题时BOOST BGL边缘索引问题

时间:2015-03-05 10:20:29

标签: c++ function boost graph arguments

我在类型的增强图中使用边缘时遇到问题:

adjacency_list < listS, vecS, undirectedS, mes_noeuds, mes_arcs > graph_t;

&#34; mes_arcs&#34;由一些论点组成:

struct mes_arcs {
    int idarc;

};

当我创建边缘时,我将每个边缘的edge_descriptor存储在一个向量中。每个边缘描述符都存储在我给边缘的idarc位置&#34; mes_arcs&#34;。

我声明了一个包含我想要传递给函数的数据的结构:

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时(通过写入调试文件),我得到了&#34; idarc&#34;的良好价值。但是当我尝试在函数之外使用该向量时,idarc的值完全错误。

所以我想知道它是否是将参数传递给函数的方法的问题,或者它是否有关于使用增强边缘索引的问题或类似的东西,当我复制{{ 1}}?

我试图在stackoverflow上找到答案但是每个人都以他需要的方式使用BOOST,因此很难找到答案。

提前感谢您阅读我的问题所花的时间。

1 个答案:

答案 0 :(得分:-1)

listS边缘容器选择器(您使用)的情况下,顶点描述符有效地一个迭代器进入图形的边缘容器(实际上是每个顶点的边缘。)

如果你复制图形,你可以使用来自源的顶点描述符,因为边缘容器已被复制到,因此描述符是不同的。


总而言之,您似乎希望拥有独特的边缘ID,即共享&#34; (相同)跨副本。这是您通常使用捆绑属性(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;

或者你可以使用&#34;外部&#34;物业地图。在这种情况下,可以调整Boost Bimap,以便您可以双向查找。 (我已经做了一些例子,将Boost Bimap用作Boost图属性图,你可以在SO上找到它)