如何将自定义图形适配到Boost图形库模板?

10

我对C++模板有点生疏,同时我正在使用boost图形库(这是一个致命的结合)。我搜索了网络但找不到如何将自定义图形结构与BGL(boost图形库)相匹配以便使用boost的图形遍历算法的直接指导。是否有熟悉该库的人可以帮助我?

编辑:所以,我一直遇到的主要问题是在哪里找到源代码来完全满足将任意图形映射到BGL图形需求。我对模板非常陌生,所以很难阅读BGL的规范/示例。也许我应该寻找有关模板的通用来源?


如果您能提供一份您自定义图结构的样例,那将非常有帮助。 - deft_code
2个回答

6
我的建议是,除非你已经在BGL上编写了大量代码,否则最好放弃使用它。最近我在测试它,准备用于一个大型图形分析项目,但由于过度复杂且设计不良的API,我发现它几乎无法使用。
在BGL中没有简单的任务,只有复杂的任务,由于BGL具有过于复杂的模板层次结构,我经常与编译器作斗争。几乎没有有用的文档(至少不在真正需要的地方),而且示例不足,这只会加剧问题。这不是编写代码的正确方式。
我建议切换到LEMON。它很稳定,用C++编写,易于理解和编写,提供几种专门的图形以支持不同的使用需求,并支持BFS和DFS搜索/访问器函数。它还有自己的节点/边缘属性映射,因此您应该能够将自己的图形结构和其他数据适配到其中。
尝试一下LEMON;它口感更好,会导致更少的溃疡。;-)

2
我刚刚在一个拥有一百万个节点和一亿条边的图上测试了LEMON,它很好地扩展并且没有性能问题等。 - Joel Hoff
谢谢你的想法!不幸的是,我正在处理一个非常庞大的代码库,而且我认为我的老板不希望增加额外的依赖。 :S - Michael
1
哦,很高兴听到我不是唯一一个认为BGL非常复杂和过于普遍,而且示例并不特别明显的人! - Michael
很高兴听到我不是唯一一个觉得BGL可能过于复杂的人 - 我会研究LEMON - 谢谢! - kfmfe04

5

据我理解,这种方法是为了针对您的图形类型专门化boost::graph_traits结构。这会为BGL配置各种重要属性,使其了解有关您的图形的信息。然后,您需要针对您的图形的专门化graph_traits类型来专门化全局模板函数,以实现任何适用于您特定类型图形的boost图形接口。

在BGL文档中有一个例子:

http://www.boost.org/doc/libs/1_43_0/libs/graph/doc/leda_conversion.html

这里有几个不同接口的链接,它们指示了如果您想支持该接口,则需要专门化哪些全局模板函数以适应您的图表。完整的接口列表在这里:

http://www.boost.org/doc/libs/1_43_0/libs/graph/doc/graph_concepts.html


1
我已经阅读了BGL文档的大部分内容,以便让模板工作。然而,如果您不熟悉LEDA,您所展示的示例并不是微不足道的,并且解释得也不够清楚。如果您查看他们的代码,几乎完全没有注释。我在boost图形网站上找到的每一段代码几乎都没有注释,对于这种通用对象来说,这相当令人沮丧。 - Michael
如果您指出您不清楚的具体事项或与您的图形结构相关的具体事项会有所帮助,这样可以使适应过程更容易。 - Owen S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接