问题描述
我使用了一个Python库生成以下的GraphViz .DOT文件。
我想现在读入C ++的升压::图这样我就可以使用它的boost ::图的图书馆算法。
不过,我需要做一些preprocessing。特别是,我想创建一个字符串构造一个捆绑的财产,有read_graphviz()传递字符串中的标签字段中的点文件写入字符串的构造函数。
我如何去这样做?
要实现的第一件事是,Boost文档样本几乎的始终是指从实际的样品产生/:的
要实现第二件事是,BGL是非常通用的。高度。它实现了多本泛型在。
最后,观察,从自由形式解析(至少动态/非类型化的文本形式)到某种的通用的模型的是挑战极限。
这说明了你会怎么有在的文档进行property_map 。
总之,因为确实似乎有点过时了,让我来演示:
-
包含解析器的实现为一个翻译单元:
的#include<库/图/ src目录/ read_graphviz_new.cpp>
这样BGL仍然是一个只有标题库。
-
preFER捆绑的属性,这些天:
结构顶点{
标准::字符串名称,标签,形状;
};结构边缘{
性病::字符串标签;
双权重; //也许你需要这个以后还有,只是一个例子
};typedef的财产< graph_name_t,标准::字符串> graph_p;
的typedef的adjacency_list<血管内皮细胞,血管内皮细胞,directedS,顶点,边graph_p> graph_t;我们将填写
标签
,形状
,名称
顶点和边。 -
的动态属性映射是那里的奇迹发生:
的dynamic_properties DP / *(ignore_other_properties)* /;
这个类提供了多种基础的通过(姓名,typeid的(为key_type))。
这意味着你可以注册绑定的属性,它们映射到graphviz的属性名称:
INT的main(){
//构造一个空的图形和prepare的dynamic_property_maps。
graph_t图(0); dynamic_properties的DP(ignore_other_properties);
dp.property(NODE_ID,得到(安培;顶点::名称,图形));
dp.property(标签,得到(安培;顶点::标签,图表));
dp.property(形,得到(安培;顶点::形状,图形));
dp.property(标签,得到(安培;边缘::标签,图表));Though we don't need it, let's throw the graph property in the mix too (as in the documentation sample):
// 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);
Now all that's left is reading the graph.
Well. Okay then. And let's write it back out too, but with a new graph name, then:
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"*/); }
Don't forget to link to Boost Regex
Full Demo
#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"*/);
}
}
Prints (note the empty name before, and the updated graph name attribute, after):
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"];
}
这篇关于read_graphviz()中的boost ::图,传递给构造的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!