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";