提升read_graphml示例

时间:2011-07-29 19:07:51

标签: c++ boost adjacency-list graphml

我正在尝试使用BOOST库构建一个简单的GraphML加载器。我有一个GraphML文件,我想在boost邻接列表结构中加载它。该图是定向的,它存储的唯一信息是节点的名称(0,1,2,...)以及从一个节点到另一个节点的边。我做的是:

void loadHierarchy(){
    // ...
    std::ifstream inFile;
    inFile.open("ext.gml", std::ifstream::in);

    typedef boost::adjacency_list<> Graph;
    Graph g;

    boost::read_graphml(inFile, g);
    // ...
}

我不需要使用任何属性,只是为了将整个图形信息保存在邻接列表中。

我得到的错误如下:

  

错误:从类型‘boost::mutate_graph&’

的表达式初始化‘loadHierarchy()::Graph’类型的引用无效      

/usr/include/boost/graph/graphml.hpp:194:错误:传递‘void boost::read_graphml(std::istream&, boost::mutate_graph&)’的参数2

应该这么简单,但显然不是。

2 个答案:

答案 0 :(得分:1)

我认为你应该使用read_graphml()的3参数版本,即使你不需要设置任何属性。您要使用的两个参数版本是(不幸暴露的)库的内部细节。

所以,我建议你尝试这样的事情:

boost::dynamic_properties dp;
boost::read_graphml(inFile, g, dp);

我希望它有所帮助。

答案 1 :(得分:1)

经过更彻底的调查后,我得出的结论是,幸运的是,暴露了2个参数版本的boost :: read_graphml。 3个参数看起来像这样:

template<typename MutableGraph>
void
read_graphml(std::istream& in, MutableGraph& g, dynamic_properties& dp)
{
    mutate_graph_impl<MutableGraph> mg(g,dp);
    read_graphml(in, mg);
}

有一个特别好的GraphML编辑器,即输出一种格式错误的GraphML文件的yEd,例如它有像

这样的标签
<key for="node" id="d6" yfiles.type="nodegraphics"/>

在里面。上面的键应该有一个 attr.type =“string”,但它没有。它有一个yfiles.type,它似乎是yEd正在使用的扩展(不幸的是)。默认的mutate_graph_impl无法处理此问题。 mutate_graph_impl将需要由您继承,并且您需要直接调用2版本的read_graphml,并将自己的mutate_graph_impl实现传递给它。 在您自己的实现中,您将需要覆盖mutate_graph_impl的

virtual void
    set_vertex_property(const std::string& name, any vertex, const std::string& value, const std::string& value_type)

使用未指定的attr.type处理密钥。