2012-12-16 35 views
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 ::图形工作直接
  2. 解析数据直接进入了boost ::图形数据结构(和例如,使用包含boost::adjacency_list<boost::mapS, boost::vecS, boost::directedS, Block, Signal>之类的捆绑属性的图表)

但是看起来我不够聪明,无法理解这里的文档。我在网上发现的所有例子都显示了如何使用捆绑的属性 - 但不知道如何在运行中使用这些属性来构建图。 (当然,不是同时具有节点和顶点属性,或者如何使用节点通过它们的名称访问它们,...)

有人可以帮我吗?

谢谢!

回答

4

没有人对boost :: graph文档足够聪明;)学习如何使用它需要很多时间。

你可以在你的数据中添加一个boost图形结构,但是,这可能会很痛苦。这里有一个文档: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); 

您可能需要维持一个地图,同时解析。

+0

好吧,现在我采取了解决方案2 - 它的工作:) :) :)除了(现在...)直接添加边缘和顶点参数对我来说最大的剩余问题是有效处理名称的顶点。解决方法是将名称保留在'Block'以及'std :: map '中(并且使两者都同步)。所以我可以通过它的名字(通过'map')快速查找存储的Block以及当我获得该块(通过属性)时它的名称, – Chris