C++ BGL通过关键点索引顶点

C++ BGL通过关键点索引顶点,c++,boost,boost-graph,C++,Boost,Boost Graph,我的要求是拥有一个图形结构,其中每个顶点都由一个boost::uuids::uuid唯一标识。所有顶点都有一个颜色属性,相似类别的顶点将根据该属性进行分组。我不是在静态贴图上工作,顶点和边将动态创建和删除 typedef boost::adjacency_list< boost::listS, boost::listS, boost::bidirectionalS, boost::property<boost::vertex_index

我的要求是拥有一个图形结构,其中每个顶点都由一个
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;
添加顶点时

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;
}
对于列表ing顶点的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\u列表;
boost::graph_traits::vertex_迭代器vi,vi_end;
对于(boost::tie(vi,vi_end)=boost::顶点(_图);vi!=vi_end;++vi){
列表。向后推(索引映射[*vi]);
}
退货清单;
通过这种方式,我总是遍历图的顶点并获得其属性。然而,我也想要另一种方式。从UUID到顶点,就像一个并行std::map,它将通过添加/删除操作或类似操作自动更新

此外,我无法保持外部
std::map
并手动同步,因为
boost::adjacency\u list::vertex\u描述符的计算结果为
void*
,我需要序列化支持

那么,以下事情可行吗

  • 通过
    boost::vertex\u index\u t
    值查找顶点
  • 遍历
    boost::property\u映射
  • 将外部
    std::map
    bimap
    index
    属性同步

  • 我记得库中有一个
    标记的_graph
    实用程序大致支持这一点。它具有很高的便利性,我似乎记得它在效率方面没有那么有趣。应该有一个使用它的样本:

    不管怎样(回到前面的问题),您当然可以使用外部属性映射。这有以下好处:

    • 您可以随时保留图表中不存在的条目
    • 您可以获得所需的反向索引,请参见

      • (用于获取彩色地图的反向查找)

        它还包含一个等效的方法,但使用Boost多索引容器,这甚至更灵活

    答案:
  • 通过
    boost::vertex\u index\u t
    值查找顶点

    是的,但是如果您想提高效率,确实需要为反向查找提供一个外部映射,或者使用您自己的数据结构并使其适应(显然需要做更多的工作)

  • 遍历
    boost::property\u映射

    你可以。使用
    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";
    
    boost::property\u map::type pmap=boost::get(boost::vertex\u index,graph);
    图特征:顶点迭代器b,e;
    对于(boost::tie(b,e)=boost::顶点(图);b!=e;++b)
    
    std::cout in(2)不是迭代
    属性映射
    而是迭代
    顶点()。我认为会有一个
    multimap
    类接口,它与
    std::pair
    类似
    value\u type
    ,(3)问题是,要使用贴图,我需要像
    vertex\u描述符这样的东西才能保持稳定。对于稳定的
    顶点描述符
    需要使用
    列表
    ,而不是
    向量
    。但是对于
    列表
    顶点描述符
    的计算结果是
    void*
    ,我无法理解这个悖论。因为如果将
    void*
    存储在
    std::map
    中,它将不可用。此外,还有其他一些问题,例如,
    label_graph
    不可序列化(1)通过
    boost::vertex_index_t
    查找顶点的低效方法是什么?对
    顶点进行线性搜索()
    (这不是通过索引查找顶点)?这并没有悖论。序列化顶点描述符根本没有意义,除非它们是顶点id。如果不是,您必须添加一个顶点id并使用它。它总是这样工作的。所以,做你通常做的事。当你陷入困境时,通过编程摆脱困境。以下是我的现场尝试:@NeelBasu我无法让它正常工作:(如果我能让过载解析拦截器正常工作,我会继续。现在是凌晨1:46,我宣布退出:((中间:)简短的想法是只需要一个外部bimap(这样你就可以查看)。对于序列化,只需在加载顶点及其属性后构建bimap,而不序列化原始bimap。
    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";