【问题标题】:C++ Boost Graph Library: outputting custom vertex propertiesC++ Boost Graph Library:输出自定义顶点属性
【发布时间】:2024-04-17 02:55:01
【问题描述】:

我正在努力让自定义属性编写器与 BGL 一起工作。

struct IkGraph_VertexProperty {
    int id_ ;
    int type_ ;
    std::pair<int,int> gaussians_ ; // Type of Joint, Ids of Gaussians
};


struct IkGraph_VertexPropertyTag
{
typedef edge_property_tag kind;
static std::size_t const num; 
};

std::size_t const IkGraph_VertexPropertyTag::num = (std::size_t)&IkGraph_VertexPropertyTag::num;

typedef property<IkGraph_VertexPropertyTag, IkGraph_VertexProperty> vertex_info_type;

...方法中定义的自定义图

typedef adjacency_list<setS, vecS, bidirectionalS, vertex_info_type, IkGraph_EdgeProperty> TGraph ;
TGraph testGraph ;
std::ofstream outStr(filename) ;
write_graphviz(outStr, testGraph, OurVertexPropertyWriter<TGraph,IkGraph_VertexPropertyTag, IkGraph_VertexProperty>(testGraph));

...

template <class Graph, class VertexPropertyTag, class VertexProperty>
struct OurVertexPropertyWriter {

  OurVertexPropertyWriter(Graph &g_) : g(g_) {}

 template <class Vertex>
 void operator() (std::ostream &out, Vertex v) {

    VertexProperty p = get (VertexPropertyTag(), g, v);
      out << "[label=" << p.gaussians_.first << "]";

  }

 Graph &g;
};

这会产生一系列错误。

我真正想做的(不知道这是否可能)是能够概括这一点并传递存在哪些自定义属性/我想输出哪些自定义属性。

【问题讨论】:

    标签: c++ boost graphviz boost-graph


    【解决方案1】:

    我不会更正您的代码,因为我无法验证它是否会按预期工作。 但是由于我遇到了同样的问题,所以我将发布我的代码的相关部分作为你和其他人的示例。我希望这可能会有所帮助。

    图的定义

    typedef boost::adjacency_list<boost::vecS, 
                                  boost::vecS, 
                                  boost::bidirectionalS, 
                                  boost::no_property, 
                                  EdgeProp, //this is the type of the edge properties
                                  boost::no_property, 
                                  boost::listS> Graph;
    

    边缘属性

    struct EdgeProp
    {
            char name;
            //...
    
    };
    

    边缘的属性编写器

    template <class Name>
    class myEdgeWriter {
    public:
         myEdgeWriter(Name _name) : name(_name) {}
         template <class VertexOrEdge>
         void operator()(std::ostream& out, const VertexOrEdge& v) const {
                out << "[label=\"" << name[v].name << "\"]";
         }
    private:
         Name name;
    };
    

    属性必须提前附加到边缘。 例如

    EdgeProp p;
    p.name = 'a';
    g[edge_descriptor] = p;
    

    调用boost来创建graphviz文件

    myEdgeWriter<Graph> w(g);
    ofstream outf("net.gv");
    boost::write_graphviz(outf,g,boost::default_writer(),w);
    

    对于顶点属性编写器,我们只使用默认编写器。

    【讨论】: