【问题标题】:Saving no-parallel edge graph to a graphml file using boost使用 boost 将非平行边图保存到 graphml 文件
【发布时间】:2012-10-14 22:04:55
【问题描述】:

以下代码将图形保存到 graphml 文件中。有用!。但是当我用typedef adjacency_list< setS, setS, directedS, 替换typedef adjacency_list< vecS, vecS, directedS, 以便没有重复的顶点或边插入到图中时,它会抱怨。

#include <boost/graph/graphml.hpp>

using namespace std;
typedef struct {
  string name;
  string label;
} vertex_type_t;

int main(int,char*[])
{

  using namespace boost;

  typedef adjacency_list< vecS, vecS, directedS, 
      vertex_type_t > graph_t;

  graph_t g;
  graph_t::vertex_descriptor v1 = add_vertex(g);
  graph_t::vertex_descriptor v2 = add_vertex(g);

  dynamic_properties dp;
  dp.property("name", get(&vertex_type_t::name, g));

  write_graphml(std::cout, g, dp, true);

  return 0;
}

我无法从错误中得到太多。我相信以下是主要错误。

/usr/include/boost/graph/graphml.hpp: In function ‘void boost::write_graphml(std::ostream&, const Graph&, VertexIndexMap, const boost::dynamic_properties&, bool) [with Graph = boost::adjacency_list<boost::setS, boost::setS, boost::directedS, vertex_type_t>, VertexIndexMap = boost::adj_list_vertex_property_map<boost::adjacency_list<boost::setS, boost::setS, boost::directedS, vertex_type_t>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t>, std::ostream = std::basic_ostream<char>]’:
/usr/include/boost/graph/graphml.hpp:345:5:   instantiated from ‘void boost::write_graphml(std::ostream&, const Graph&, const boost::dynamic_properties&, bool) [with Graph = boost::adjacency_list<boost::setS, boost::setS, boost::directedS, vertex_type_t>, std::ostream = std::basic_ostream<char>]’
write_graphviz.cpp:24:39:   instantiated from here
/usr/include/boost/graph/graphml.hpp:301:9: error: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char>]((* & out), ((const char*)"    <node id=\"n")) << boost::get [with PropertyMap = boost::adj_list_vertex_property_map<boost::adjacency_list<boost::setS, boost::setS, boost::directedS, vertex_type_t>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t>, Reference = const boost::detail::error_property_not_found&, K = void*]((*(const boost::put_get_helper<const boost::detail::error_property_not_found&, boost::adj_list_vertex_property_map<boost::adjacency_list<boost::setS, boost::setS, boost::directedS, vertex_type_t>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t> >*)(& vertex_index)), (* & v.std::_Rb_tree_const_iterator<_Tp>::operator* [with _Tp = void*, std::_Rb_tree_const_iterator<_Tp>::reference = void* const&]()))’
/usr/include/boost/graph/graphml.hpp:301:9: note: candidates are:
/usr/include/c++/4.6/ostream:110:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ostream_type& (*)(std::basic_ostream<_CharT, _Traits>::__ostream_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
/usr/include/c++/4.6/ostream:110:7: note:   no known conversion for argument 1 from ‘const boost::detail::error_property_not_found’ to ‘std::basic_ostream<char>::__ostream_type& (*)(std::basic_ostream<char>::__ostream_type&) {aka std::basic_ostream<char>& (*)(std::basic_ostream<char>&)}’
/usr/include/c++/4.6/ostream:119:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ios_type& (*)(std::basic_ostream<_CharT, _Traits>::__ios_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>, std::basic_ostream<_CharT, _Traits>::__ios_type = std::basic_ios<char>]

我真的很想用 setS 作为边缘容器。我不确定如何修改此程序以使其开始工作,因为错误消息对我来说没有多大意义。

【问题讨论】:

    标签: c++ boost-graph


    【解决方案1】:

    问题是 write_graphml 在你的图中需要一个 VertexIndexMap 并且只有 adjacency_lists 和 VertexList=vecS 默认创建一个。如果您使用listSsetS,则必须自己创建一个。

    我真的很想用 setS 作为边缘容器。

    如果您只需要在OutEdgeList 中使用setS,您可以简单地使用:

    typedef adjacency_list< setS, vecS, directedS, 
      vertex_type_t > graph_t;
    

    如果您必须同时使用setS,那么您的程序应该是(基于this answer):

    #include <boost/graph/graphml.hpp>
    #include <boost/graph/iteration_macros.hpp>
    
    #include <map>
    
    using namespace std;
    typedef struct
    {
        string name;
        string label;
    } vertex_type_t;
    
    int main ( int, char*[] )
    {
    
        using namespace boost;
    
        typedef adjacency_list < setS, vecS, directedS,
                vertex_type_t > graph_t;
    
        typedef graph_t::vertex_descriptor NodeID; //define your Vertex Index Map
        typedef std::map<NodeID, size_t> IndexMap;
        IndexMap mapIndex;
        boost::associative_property_map<IndexMap> propmapIndex ( mapIndex );
    
        graph_t g;
        graph_t::vertex_descriptor v1 = add_vertex ( g );
        graph_t::vertex_descriptor v2 = add_vertex ( g );
    
        int i = 0;                                  //fill your Vertex Index Map
        BGL_FORALL_VERTICES ( v, g, graph_t )
        {
            put ( propmapIndex, v, i++ );
        }
    
        g[v1].name="FirstVertex";
        g[v2].name="SecondVertex";
    
        dynamic_properties dp;
        dp.property ( "name", get ( &vertex_type_t::name, g ) );
    
        write_graphml ( std::cout, g, propmapIndex, dp, true );
    
        return 0;
    }
    

    【讨论】:

      【解决方案2】:

      我的第一个想法是新的graphtype(带有setS)不满足write_graphml(..)函数的要求:http://www.boost.org/doc/libs/1_51_0/libs/graph/doc/write_graphml.html

      它声明“图形的类型必须是 VertexListGraph 的模型”。它在这里描述:http://www.boost.org/doc/libs/1_51_0/libs/graph/doc/VertexListGraph.html

      【讨论】:

        猜你喜欢
        • 2021-11-17
        • 1970-01-01
        • 2017-04-12
        • 2013-10-27
        • 1970-01-01
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多