c – Boost Graph Library:捆绑属性并跨边迭代

只是试图了解Boost图库,我有几个问题.我正在编写一些代码,它是围绕BGL图形的包装类.我的想法是,我可以操作我想要的图形,然后调用包装器方法以GEXF( XML)格式输出图形.

我的代码是这样的:

struct Vertex {
   std::string label;
   ...
};

struct Edge {
   std::string label;
   double weight;
   ...
};

typedef boost::adjacency_list<boost::vecS,boost::vecS,boost::directedS,Vertex,Edge> GraphType;

template <typename Graph>
class GEXF
{
   private:
      Graph graph;
   ...
};

template <typename Graph>
void GEXF<Graph>::buildXML()
{
   ...

   // output the edges
   property_map<adjacency_list<>,edge_index_t>::type edge_id = get(edge_index,graph);
   GraphType::edge_iterator e,e_end;
   for(tie(e,e_end) = edges(graph); e != e_end; ++e)
   {
      xmlpp::Element *edge = ePtr->add_child("edge");

      // next line gives an error,property not found
      edge->set_attribute("id",tostring<size_t>(get(edge_id,*e)));
      edge->set_attribute("source",tostring<size_t>(source(*e,graph)));
      edge->set_attribute("target",tostring<size_t>(target(*e,graph)));
   }
}

...
// instantiate in main():
GEXF<GraphType> gexf;

这是我的问题:

>当我使用捆绑属性时,我可以访问vertex_index,但我无法访问edge_index.如何访问边缘索引?
>在上面的代码中,我想保持GEXF类的通用性,但是当我尝试声明Graph :: edge_iterator e,e_end时遇到了问题.上面的代码有效,但它使用的是具体类型.我应该如何一般性地声明edge_iterator?

解决方法

认情况下,boost :: adjacency_list< ...>中没有edge_index.对象,因为维护一个会影响复杂性.您必须自己创建一个,但必须注意它提供所需的功能.

以前:

Boost Subgraph and Bundled properties

edge_index zero for all edges?

Boost Graph edges with indexes

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...