3

我正在编写一个应用程序来解析数据结构,例如

struct Block
{
  std::string foo;
  /* ... even more local data ... */
};

std::map<std::string, Block> blockContainer; // Each Block will have a name here

struct Signal
{
  // the direct links to the Blocks, no redundant storage of the name so that an
  // simple renaming of a Block would be possible
  std::map<std::string, Block>::iterator from; 
  std::map<std::string, Block>::iterator to;

  std::string bar;
  /* ... even more local data ... */
};

std::vector<Signal> signalContainer;

解析和填写这个列表非常容易。现在我需要根据信号对块进行拓扑排序 - 当我使用Boost::Graph.

但是首先在 STL 数据结构中解析它,然后将它们复制到 Boost::Graph 结构对我来说没有多大意义。特别是因为之后对这些数据所做的所有事情可能只是一些简单的修改(添加/删除块和信号,一些信号重新路由;再次将其序列化),然后再进行新的拓扑排序。

所以我对这些可能的解决方案中的任何一个都很好:

  1. 让 Boost::Graph 直接在我的容器上工作
  2. 将数据直接解析到 Boost::Graph 数据结构中(例如,使用带有捆绑属性的图,例如boost::adjacency_list<boost::mapS, boost::vecS, boost::directedS, Block, Signal>

但似乎我也不够聪明,无法理解这里的文档。此外,我在网上找到的所有示例都显示了如何使用捆绑属性 - 但没有显示如何使用动态构建图表。(当然,不能同时使用节点和顶点属性,或者如何使用 astd::map让节点通过它们的名称来访问它们,...)

有人可以帮我吗?

谢谢!

4

1 回答 1

4

对于 boost::graph 文档,没有人足够聪明 ;) 学习如何使用它需要花费大量时间。

您可以围绕数据创建提升图结构,但是,这可能会相当痛苦。那里有一个文档:http: //www.boost.org/doc/libs/1_52_0/libs/graph/doc/leda_conversion.html

我建议采用第二种方法,但我不确定你的数据结构。

您是否看到这个问题:将自定义顶点添加到提升图是否满足您的需求?

您还可以执行以下操作来创建节点(或边)并立即定义属性:

vertex_t u = boost::add_vertex(Block(42, "hi"), g);

您可能需要在解析时维护地图。

于 2012-12-16T17:17:16.653 回答