BGL:将对象映射到图形

问题描述:

我需要能够为给定图形中的每个顶点存储图形类型树。我正在尝试使用boost::ptr_map<vertex_desc, Tree> DESC,其中Tree是一个邻接列表图类型。在我创建树对象desc并添加我想要的顶点之后,我尝试将desc存储到像DESC.insert(std::make_pair(*vi.first, desc))那样的映射中,但编译器不允许它。如果我 做DESC[*vi.first] = desc编译器不会抱怨,但在此之后,我尝试使用地图时遇到非常奇怪的行为。我应该使用另一种方式来存储Tree对象吗?BGL:将对象映射到图形

+0

从我发现我明白'DESC [* vi.first] = desc'是一个非常错误的方式存储对象到'std :: map'(因为'boost :: ptr_map'是一个包装的'使用指针的std :: map')。您必须使用'new'运算符或类似'boost :: ptr_map_insert'函数来处理插入。但是我仍然发现使用ptr_map指向'boost :: adjacency_list'图形是一项非常困难的任务。 – LetsPlayYahtzee 2014-10-01 16:53:15

您必须小心使用vertex_descriptor以外的对象。从docs page中查看不同容器选择的迭代器/描述符稳定性/失效表。如果您希望顶点描述符始终有效(除非被删除),则需要使用boost::listS作为VertexList参数。这就是说,如果你想要任何关联到图顶点,你应该真的把它放到顶点属性中,特别是对于捆绑属性。但是如果你不能修改它,那么你应该照我说的去做,也就是说,确保描述符在图操作中保持有效。

+0

我终于改变了我的实现,因为使用boost :: pt_map搞砸了一切,关于你在地图中存储什么类型或数据结构的规则非常严格,我必须非常小心地恢复树并编辑例如,当我试图恢复一棵树时,每隔一个指向指向我编辑的树的同一范围内的树的其他指针,所以现在我不使用这些指针,而是使用捆绑属性将每棵树存储在顶点中(如您所建议的那样)。这是一种非一般的方法,但至少我能够对算法进行处理并测试它的执行时间。谢谢你的回应 – LetsPlayYahtzee 2014-10-01 16:45:19