首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost read_graphml示例

Boost read_graphml示例
EN

Stack Overflow用户
提问于 2011-07-29 19:07:51
回答 2查看 3.2K关注 0票数 2

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

代码语言:javascript
复制
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/Graphml.hpp:194:‘void boost::read_graphml(std::istream&, boost::mutate_graph&)’传递参数2中的错误

事情应该这么简单,但显然并非如此。

EN

回答 2

Stack Overflow用户

发布于 2011-12-12 16:40:53

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

所以,我建议你试试这样的方法:

代码语言:javascript
复制
boost::dynamic_properties dp;
boost::read_graphml(inFile, g, dp);

希望能帮上忙。

票数 2
EN

Stack Overflow用户

发布于 2012-06-15 04:31:19

经过更彻底的调查,我得出的结论是,boost::read_graphml的2 param版本是公开的,这实际上是幸运的。第三副是这样的:

代码语言:javascript
复制
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,例如它有如下所示的标记

代码语言:javascript
复制
<key for="node" id="d6" yfiles.type="nodegraphics"/>

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

代码语言:javascript
复制
virtual void
    set_vertex_property(const std::string& name, any vertex, const std::string& value, const std::string& value_type)

若要使用未指定的attr.type处理密钥,请执行以下操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6877838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档