【问题标题】:How to fit a custom graph to the boost graph library template?如何将自定义图形拟合到 boost 图形库模板?
【发布时间】:2011-03-03 15:34:15
【问题描述】:

我对 C++ 模板生疏了,我正在使用 boost 图形库(一个致命的组合)。我在网上搜索过,找不到任何关于如何采用自定义图形结构并将其足够适合 BGL(增强图形库)的直接说明,我可以使用增强图形遍历算法。有足够熟悉图书馆的人来帮助我吗?

编辑:所以,我遇到的主要问题是在哪里可以找到将任意图映射到 BGL 图的总要求的来源。我对模板真的很陌生,所以我很难阅读 BGL 的规范/示例。也许我应该寻找关于模板的一般来源?

【问题讨论】:

  • 如果我们能看到您的自定义图形结构的样例,将会有所帮助。

标签: c++ templates data-structures graph boost-graph


【解决方案1】:

我的建议是完全放弃使用 BGL,除非您已经在其上编写了大量代码。我最近正在测试它以供将来在一个大型图形分析项目中使用,我发现由于 API 过于复杂且设计不佳,它几乎无法使用。

BGL 中没有简单的任务,只有复杂的任务,而且由于 BGL 的模板层次结构过于复杂,我一直在与编译器作斗争。几乎没有有用的文档(至少在真正需要的地方没有)并且没有足够的示例只会加剧问题。这不是写代码的方法。

我建议切换到LEMON。它是稳定的,用 C++ 编写,易于理解和代码,提供了几种特殊的图形形式来支持不同的使用需求,它同时支持 BFS 和 DFS 搜索/访问器功能。它还具有自己的节点/边属性映射等价物,因此您应该能够将自己的图形结构和其他数据拟合到它上面。

试试柠檬;它尝起来好多了,而且会减少溃疡。 ;-)

【讨论】:

  • 我刚刚在一个有 100 万个节点和 1 亿条边的图上完成了 LEMON 的测试;很好地扩展,没有性能问题等。
  • 感谢您的建议!不幸的是,我正在使用大型代码库,我认为我的老板不想要另一个依赖:S
  • 哦,很高兴听到我不是唯一一个认为 BGL 非常复杂和过于笼统,而且这些示例并不是特别具有启发性的人!
  • 很高兴听到我不是唯一一个觉得 BGL 可能过于复杂的人 - 将研究 LEMON - ty!
【解决方案2】:

据我了解,该方法是针对您的图形类型专门化 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

【讨论】:

  • 我已经阅读了该网站关于让模板工作的大部分 BGL 文档。但是,如果您不熟悉 LEDA,那么您展示的示例并非微不足道,也没有得到很好的解释。如果您查看他们的代码,它几乎完全没有 cmets。我在 boost graph 网站上找到的每一段代码都几乎完全没有 cmets,而且对于一个这样通用的对象来说,这非常令人沮丧。
  • 那么,如果您指出您不清楚的具体事项或与您的图形结构相关的具体事项使适应变得困难,这将有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 2015-04-30
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
相关资源
最近更新 更多