其他分享
首页 > 其他分享> > c – BGL通过键索引顶点

c – BGL通过键索引顶点

作者:互联网

我的要求是有一个图形结构,其中每个顶点由boost :: uuids :: uuid唯一标识.所有顶点都有一个颜色属性,通过该属性可以对类似类别的顶点进行分组.我不在静态地图上工作,将动态创建和删除顶点和边.

typedef boost::adjacency_list<
      boost::listS,
      boost::listS,
      boost::bidirectionalS,
      boost::property<boost::vertex_index_t, boost::uuids::uuid, 
        boost::property<boost::vertex_color_t, resource_color,
          boost::property<boost::vertex_underlying_t,   boost::shared_ptr<actual_object*> > > >,
      detail::edge_property
      > graph_type;
graph_type _graph;
boost::property_map<graph_type, boost::vertex_index_t>::type    _index_map;
boost::property_map<graph_type, boost::vertex_color_t>::type    _color_map;
boost::property_map<graph_type, boost::vertex_underlying_t>::type   _underlying_map;

在构造函数中,我创建了所有3个映射

_index_map = boost::get(boost::vertex_index_t(), _graph);
_color_map = boost::get(boost::vertex_color_t(), _graph);
_underlying_map = boost::get(boost::vertex_underlying_t(), _graph);

同时添加一个顶点

add_resource(resource_color c, actual_object* o){
  graph_type::vertex_descriptor v = boost::add_vertex(o->uuid(), _graph);
  _color_map[v] = c;
  _underlying_map[v] = o;
}

用于列出UUID的顶点

uuid_list list;
boost::graph_traits<graph_type>::vertex_iterator vi, vi_end;
for(boost::tie(vi, vi_end) = boost::vertices(_graph); vi != vi_end; ++vi){
  list.push_back(_index_map[*vi]);
}
return list; 

这样我总是迭代图的顶点并获得它的属性.但是我也想要另一种方式.从UUID到顶点就像一个并行的std :: map,它将通过添加/删除操作或某些类似的东西自动更新.

另外我不能手动保持外部std :: map和sync,因为boost :: adjacency_list< boost :: listS,boost :: listS> :: vertex_descriptor评估为void *,我需要序列化支持.

以下事情也是可行的

>通过boost :: vertex_index_t值查找顶点
>遍历boost :: property_map
>将外部std :: map或bimap与index属性同步

解决方法:

我记得这个库有一个label_graph实用程序,大致支持这个.它具有很高的便利性,我似乎记得它在效率方面不那么有趣¹.应该有一个使用它的样本:

> http://www.boost.org/doc/libs/1_46_1/libs/graph/example/labeled_graph.cpp

无论如何(并回顾您之前的问题),您当然可以使用外部属性映射.这有好处:

>您可以随时保留不在图表中的条目
>您可以使用所需的反向索引,例如,

> Cut set of a graph, Boost Graph Library(用于获取颜色图的反向查找).

It also contains an equivalent approach but using Boost Multi-index Containers, which is much more flexible even

回答子弹:

>

find vertex through boost::vertex_index_t value

是的,但如果你想要高效,你确实需要有一个外部映射用于反向查找或使用你自己的数据结构并使其适应model the Graph Concepts you require(显然更多的工作)
>

iterate through a boost::property_map

您可以.使用boost :: get(tag,graph)获取属性映射,遍历要访问的所有实体并调用每个属性的属性映射.例如.

boost::property_map<Graph, boost::vertex_index_t>::type pmap = boost::get(boost::vertex_index, graph);
boost::graph_traits<Graph>::vertex_iterator b, e;
for (boost::tie(b,e) = boost::vertices(graph); b!=e; ++b)
    std::cout << "The vertex ID is: " << boost::get(pmap, *b) << "\n";

>

synchronizing an external std::map or bimap with index property

以上链接应该给你一些想法

¹这可以解释我自己没有用过它.

标签:c,boost,boost-graph
来源: https://codeday.me/bug/20190928/1825849.html