gpt4 book ai didi

c++ - boost::write_graphviz - 如何水平生成图形

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:45 24 4
gpt4 key购买 nike

我正在尝试使用 Boost Graph Library 生成一个显示水平图的 .dot。

创建图表时我的代码如下所示:

struct VertexP {
std::string tag;
};

struct EdgeP {
std::string symbol;
};

struct GraphP{
std::string orientation;
};

typedef boost::adjacency_list<boost::vecS,
boost::vecS, boost::directedS,
VertexP, EdgeP, GraphP> Graph;

GraphP property;
property.orientation = "LR";
Graph graph(property);
// Then fill the graph

我用来生成 .dot 文件的代码是这样的:

Graph g = creator.AutomatonToGraph(&automaton);
ofstream dot_file("automaton.dot");
dynamic_properties dp;
dp.property("node_id", get(&VertexP::tag, g));
dp.property("label", get(&VertexP::tag, g));
dp.property("label", get(&EdgeP::symbol, g));

write_graphviz_dp(dot_file, g, dp);

这会用节点和边标签完美地写入 .dot 文件,但我的问题是我想将 rankdir=LR 图形属性添加到输出文件。我试过:

Graph g = creator.AutomatonToGraph(&automaton);
ofstream dot_file("automaton.dot");
dynamic_properties dp;
dp.property("node_id", get(&VertexP::tag, g));
dp.property("label", get(&VertexP::tag, g));
dp.property("label", get(&EdgeP::symbol, g));
dp.property("rankdir", get(&GraphP::orientation, g));

write_graphviz_dp(dot_file, g, dp);

但是我从这里开始遇到了一大堆错误:

/src/lab2.cc:48:55:   required from here
/usr/include/boost/graph/detail/adjacency_list.hpp:2585:29: error: forming reference to void
typedef value_type& reference;
^~~~~~~~~

我真的是 BGL 的新手,我做错了什么?

最佳答案

阅读 dynamic_graph_properties_writer 的实现,我想你可能应该这样做

    dp.property("rankdir", boost::make_constant_property<Graph*>(std::string("LR")));

对于动态检索,您可以使用函数属性映射:( map set/get requests into C++ class/structure changes ):

#include <boost/property_map/function_property_map.hpp>

dp.property("rankdir", boost::make_function_property_map<Graph*>([](Graph const* g) { return g->m_property->orientation; }));

现场演示

查看 Live On Wandbox

#include <boost/graph/adj_list_serialize.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/property_map/function_property_map.hpp>
#include <fstream>
using namespace boost;

struct VertexP { std::string tag; };
struct EdgeP { std::string symbol; };
struct GraphP { std::string orientation; };

typedef adjacency_list<vecS, vecS, directedS, VertexP, EdgeP, GraphP> Graph;

int main() {
Graph g(GraphP{"LR"});
// Then fill the graph
add_edge(
add_vertex(VertexP{ "tag1" }, g),
add_vertex(VertexP{ "tag2" }, g),
EdgeP{ "symbol" }, g
);

{
std::ofstream dot_file("automaton.dot");
dynamic_properties dp;
dp.property("node_id", get(&VertexP::tag, g));
dp.property("label", get(&VertexP::tag, g));
dp.property("label", get(&EdgeP::symbol, g));
dp.property("rankdir", boost::make_constant_property<Graph*>(std::string("LR")));
dp.property("dummy", boost::make_function_property_map<Graph*>([](Graph const* g) { return g->m_property->orientation; }));

write_graphviz_dp(dot_file, g, dp);
}
}

哪个写

digraph G {
dummy=LR;
rankdir=LR;
tag2 [label=tag2];
tag1 [label=tag1];
tag1->tag2 [label=symbol];
}

关于c++ - boost::write_graphviz - 如何水平生成图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45426129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com