C++ 读取Boost::Graph中的_graphviz(),传递给构造函数

C++ 读取Boost::Graph中的_graphviz(),传递给构造函数,c++,boost,graph,C++,Boost,Graph,我使用python库生成了以下GraphViz.dot文件 现在我想把它读入C++的Boost::Graph,这样我就可以在上面使用Boost::Graph的库算法 但是,我需要做一些预处理。特别是,我想创建一个带有字符串构造函数的绑定属性,并让read_graphviz()将点文件标签字段中的字符串传递到字符串构造函数中 我该怎么做呢?首先要意识到的是,Boost文档样本几乎总是引用/生成于实际样本: 要认识到的第二件事是BGL是高度通用的。非常它在概念上实现了很大程度的通用性 最后,请注意

我使用python库生成了以下GraphViz.dot文件

现在我想把它读入C++的Boost::Graph,这样我就可以在上面使用Boost::Graph的库算法

但是,我需要做一些预处理。特别是,我想创建一个带有字符串构造函数的绑定属性,并让read_graphviz()将点文件标签字段中的字符串传递到字符串构造函数中


我该怎么做呢?

首先要意识到的是,Boost文档样本几乎总是引用/生成于实际样本:

要认识到的第二件事是BGL是高度通用的。非常它在概念上实现了很大程度的通用性

最后,请注意,从“自由形式”(至少是动态/非类型化文本形式)解析到某种泛型模型是有限制的

这说明了您必须如何阅读下文档的重要部分

无论如何,由于确实有点过时,请允许我证明:

  • 将解析器的实现包括在一个翻译单元中:

    #include <libs/graph/src/read_graphviz_new.cpp>
    
    此类提供了对由
    (名称、typeid(key\u type))
    标识的各种底层对象的类型擦除访问

    这意味着您可以注册绑定的属性,并将它们映射到graphviz属性名称:

    int main() {
        // Construct an empty graph and prepare the dynamic_property_maps.
        graph_t graph(0);
    
        dynamic_properties dp(ignore_other_properties);
        dp.property("node_id", get(&Vertex::name,  graph));
        dp.property("label",   get(&Vertex::label, graph));
        dp.property("shape",   get(&Vertex::shape, graph));
        dp.property("label",   get(&Edge::label,   graph));
    
    这就是一切。(请阅读,通过找到)

    虽然我们不需要它,但让我们也将graph属性放入混合中(如文档示例中所示):

    //使用ref\u property\u map将图形属性转换为属性映射
    boost::ref_property_map gname(get_property(graph,graph_name));
    dp.财产(“名称”,gname);
    
  • 现在只剩下阅读图表了

    嗯。那好吧。让我们也把它写出来,但是用一个新的图形名,然后:

    std::ifstream dot("input.dot");
    
    if (read_graphviz(dot, graph, dp/*, "node_id"*/)) {
        std::cout << "Graph name: '" << get_property(graph, graph_name) << "'\n";
        get_property(graph, graph_name) = "Let's give it a name";
        write_graphviz_dp(std::cout, graph, dp/*, "node_id"*/);
    }
    
    std::ifstream-dot(“input.dot”);
    if(读取图(点、图、dp/*,“节点id”*/){
    
    std::cout无法授予构造函数。该算法特别要求属性是默认可构造的(嘿,文档没那么糟糕:)(您可以解析为临时图,并从首选图类型中的临时图构建克隆)哇!让我删除对文档的评论。我不是程序员,要让它正常工作很令人沮丧。@avak哦,我确实意识到我有一个“不公平”的优势,那就是我以前多次阅读过这些文档(尽管如此,我发现值得注意的是,我只是通过
    邻接列表
    的页面找到了属性包的文档,例如)。Cheers@sehe啊,我知道问题出在哪里了,我在使用:
    vertex\u index
    as
    node\u id
    dp.property(“node\u id”,get(boost::vertex\u index,graph))
    propertymap的put方法无法将顶点索引放入属性映射中,方法是将其更改为另一个属性,如字符串。phcerdan您可以通过手动建模LevaluePropertyMap概念并输入它来伪造它(您可以使其成为
    put
    操作抛出的对象?)@phcerdan啊。又一天,谷歌告诉我,我以前回答过一个非常类似的问题(看起来你甚至不必为缺少的
    put
    操作操心:如果代码不使用概念界面的那部分,这不是问题)
    int main() {
        // Construct an empty graph and prepare the dynamic_property_maps.
        graph_t graph(0);
    
        dynamic_properties dp(ignore_other_properties);
        dp.property("node_id", get(&Vertex::name,  graph));
        dp.property("label",   get(&Vertex::label, graph));
        dp.property("shape",   get(&Vertex::shape, graph));
        dp.property("label",   get(&Edge::label,   graph));
    
        // Use ref_property_map to turn a graph property into a property map
        boost::ref_property_map<graph_t *, std::string> gname(get_property(graph, graph_name));
        dp.property("name",    gname);
    
    std::ifstream dot("input.dot");
    
    if (read_graphviz(dot, graph, dp/*, "node_id"*/)) {
        std::cout << "Graph name: '" << get_property(graph, graph_name) << "'\n";
        get_property(graph, graph_name) = "Let's give it a name";
        write_graphviz_dp(std::cout, graph, dp/*, "node_id"*/);
    }
    
    #include <boost/graph/adjacency_list.hpp>
    #include <boost/graph/graphviz.hpp>
    #include <boost/property_map/dynamic_property_map.hpp>
    #include <libs/graph/src/read_graphviz_new.cpp>
    #include <boost/graph/graph_utility.hpp>
    
    using namespace boost;
    
    struct Vertex {
        std::string name, label, shape;
    };
    
    struct Edge {
        std::string label;
        double weight; // perhaps you need this later as well, just an example
    };
    
    typedef property<graph_name_t, std::string> graph_p;
    typedef adjacency_list<vecS, vecS, directedS, Vertex, Edge, graph_p> graph_t;
    
    int main() {
        // Construct an empty graph and prepare the dynamic_property_maps.
        graph_t graph(0);
    
        dynamic_properties dp/*(ignore_other_properties)*/;
        dp.property("node_id", get(&Vertex::name,  graph));
        dp.property("label",   get(&Vertex::label, graph));
        dp.property("shape",   get(&Vertex::shape, graph));
        dp.property("label",   get(&Edge::label,   graph));
    
        // Use ref_property_map to turn a graph property into a property map
        boost::ref_property_map<graph_t *, std::string> gname(get_property(graph, graph_name));
        dp.property("name",    gname);
    
        std::ifstream dot("input.dot");
    
        if (read_graphviz(dot, graph, dp/*, "node_id"*/)) {
            std::cout << "Graph name: '" << get_property(graph, graph_name) << "'\n";
            get_property(graph, graph_name) = "Let's give it a name";
            write_graphviz_dp(std::cout, graph, dp/*, "node_id"*/);
        }
    }
    
    Graph name: ''
    digraph G {
    name="Let's give it a name";
    n0 [label="A9\n", shape=box];
    n1 [label="- [0.48%,19.42%]", shape=ellipse];
    n11 [label="+ [0%,0%]", shape=ellipse];
    n12 [label="- [0%,0.75%]", shape=ellipse];
    n13 [label="+ [0.03%,1.33%]", shape=ellipse];
    n14 [label="- [0%,0.75%]", shape=ellipse];
    n15 [label="+ [0%,0%]", shape=ellipse];
    n16 [label="+ [0%,0%]", shape=ellipse];
    n17 [label="A14\n", shape=box];
    n18 [label="+ [0.03%,2.51%]", shape=ellipse];
    n19 [label="A15\n", shape=box];
    n2 [label="A15\n", shape=box];
    n20 [label="A6\n", shape=box];
    n21 [label="A2\n", shape=box];
    n22 [label="- [0%,1.11%]", shape=ellipse];
    n23 [label="+ [0%,1%]", shape=ellipse];
    n25 [label="- [0%,2.18%]", shape=ellipse];
    n26 [label="+ [0%,1.79%]", shape=ellipse];
    n27 [label="- [0%,1%]", shape=ellipse];
    n28 [label="- [0%,0%]", shape=ellipse];
    n29 [label="- [0%,0%]", shape=ellipse];
    n3 [label="A11\n", shape=box];
    n30 [label="- [0%,0%]", shape=ellipse];
    n31 [label="- [0%,0%]", shape=ellipse];
    n32 [label="- [0%,1%]", shape=ellipse];
    n33 [label="A13\n", shape=box];
    n34 [label="+ [0%,1%]", shape=ellipse];
    n35 [label="- [0%,0%]", shape=ellipse];
    n36 [label="- [0.01%,1.21%]", shape=ellipse];
    n38 [label="A12\n", shape=box];
    n39 [label="- [0%,1%]", shape=ellipse];
    n4 [label="A4\n", shape=box];
    n40 [label="+ [0%,1.17%]", shape=ellipse];
    n42 [label="- [0%,0%]", shape=ellipse];
    n43 [label="A12\n", shape=box];
    n44 [label="+ [0%,1.11%]", shape=ellipse];
    n45 [label="- [0%,1%]", shape=ellipse];
    n47 [label="- [0%,0%]", shape=ellipse];
    n49 [label="+ [0%,1.17%]", shape=ellipse];
    n5 [label="+ [0%,0%]", shape=ellipse];
    n52 [label="+ [0%,0.75%]", shape=ellipse];
    n54 [label="A13\n", shape=box];
    n55 [label="A14\n", shape=box];
    n56 [label="- [0.03%,2.5%]", shape=ellipse];
    n57 [label="+ [0.01%,2.27%]", shape=ellipse];
    n59 [label="- [0%,0%]", shape=ellipse];
    n6 [label="A7\n", shape=box];
    n60 [label="+ [0%,1%]", shape=ellipse];
    n63 [label="A15\n", shape=box];
    n64 [label="+ [0.05%,1.34%]", shape=ellipse];
    n65 [label="A15\n", shape=box];
    n66 [label="- [0%,1%]", shape=ellipse];
    n67 [label="+ [0.02%,2.44%]", shape=ellipse];
    n7 [label="A14\n", shape=box];
    n71 [label="+ [0.21%,3.83%]", shape=ellipse];
    n8 [label="+ [0%,1.57%]", shape=ellipse];
    n9 [label="- [0.01%,1.22%]", shape=ellipse];
    n0->n1  [label=f];
    n0->n2  [label=t];
    n17->n18  [label="<=110"];
    n17->n19  [label=">110"];
    n19->n20  [label="<=8"];
    n19->n49  [label=">8"];
    n2->n3  [label="<=228"];
    n2->n71  [label=">228"];
    n20->n21  [label=aa];
    n20->n25  [label=c];
    n20->n26  [label=cc];
    n20->n27  [label=d];
    n20->n28  [label=e];
    n20->n29  [label=ff];
    n20->n30  [label=i];
    n20->n31  [label=j];
    n20->n32  [label=k];
    n20->n33  [label=m];
    n20->n38  [label=q];
    n20->n42  [label=r];
    n20->n43  [label=w];
    n20->n47  [label=x];
    n21->n22  [label="<=41"];
    n21->n23  [label=">41"];
    n3->n4  [label="<=3"];
    n3->n63  [label=">3"];
    n33->n34  [label=g];
    n33->n35  [label=p];
    n33->n36  [label=s];
    n38->n39  [label=f];
    n38->n40  [label=t];
    n4->n5  [label=l];
    n4->n6  [label=u];
    n4->n54  [label=y];
    n43->n44  [label=f];
    n43->n45  [label=t];
    n54->n55  [label=g];
    n54->n59  [label=p];
    n54->n60  [label=s];
    n55->n56  [label="<=204"];
    n55->n57  [label=">204"];
    n6->n7  [label=bb];
    n6->n11  [label=dd];
    n6->n12  [label=ff];
    n6->n13  [label=h];
    n6->n14  [label=j];
    n6->n15  [label=n];
    n6->n16  [label=o];
    n6->n17  [label=v];
    n6->n52  [label=z];
    n63->n64  [label="<=4"];
    n63->n65  [label=">4"];
    n65->n66  [label="<=5"];
    n65->n67  [label=">5"];
    n7->n8  [label="<=164"];
    n7->n9  [label=">164"];
    }