使用现有数据结构提升图表或将其用作数据结构

时间:2012-12-16 15:16:22

标签: c++ boost-graph

我正在编写一个使用类似

解析数据结构的应用程序
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>等捆绑属性的图表
  3. 但似乎我不够聪明,无法理解这里的文档。我在网上找到的所有示例都展示了如何使用捆绑属性 - 但不是如何使用动态构建图形。 (当然,不是同时使用节点和顶点属性,或者如何使用std::map节点通过其名称访问它们,...)

    有人能帮助我吗?

    谢谢!

1 个答案:

答案 0 :(得分:4)

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

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

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

您是否看到了这个问题:adding custom vertices to a boost graph它能满足您的需求吗?

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

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

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