繁体   English   中英

Boost Graph库:捆绑属性和跨边缘迭代

[英]Boost Graph Library: Bundled Properties and iterating across edges

只是想让我了解Boost Graph库,我有几个问题。 我正在写一些代码,它是围绕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;

这是我的问题:

  1. 使用捆绑属性时,我可以访问vertex_index,但不能访问edge_index。 如何获得边缘索引?

  2. 在上面的代码中,我想保持GEXF类的通用性,但是在尝试声明Graph::edge_iterator e, e_end;时遇到了一个问题Graph::edge_iterator e, e_end; 上面的代码有效,但是它使用的是具体类型。 我应该如何通用地声明edge_iterator?

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

以前:

提升子图和捆绑属性

edge_index所有边缘为零?

使用索引增强图形边缘

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM