试着了解Boost Graph Library,我有几个问题。我正在编写一些代码,它是围绕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?
答案 0 :(得分:2)
boost::adjacency_list<...>
对象中默认没有edge_index,因为维护一个会影响复杂性。你必须自己创建一个,但你必须小心它提供所需的功能。
以前:
Boost Subgraph and Bundled properties