我在类型的增强图中使用边缘时遇到问题:
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,因此很难找到答案。
提前感谢您阅读我的问题所花的时间。
答案 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上找到它)