BGL:捆绑属性的自定义 属性 编写器和 listS 为 VertexList/EdgeList
BGL: Custom Property Writer for Bundled Properties and listS as VertexList/EdgeList
我从 post 中获取以下代码并将 VertexList 和 EdgeList 更改为 listS 而不是 vecS。 我发现由于缺少索引 make_label_writer(get(&VertexProps::name, g))
不起作用。谁能告诉我应该如何更改代码才能使其正常工作。我更喜欢使用自定义 属性 编写器的解决方案。
非常感谢。
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
struct VertexProps { std::string name; };
struct EdgeProps { std::string name; };
typedef boost::adjacency_list<boost::listS, boost::listS, boost::directedS, VertexProps, EdgeProps> Graph;
int main() {
Graph g(3);
g[0].name = "one";
g[1].name = "two";
g[2].name = "three";
add_edge(1, 0, {"e1"}, g);
add_edge(2, 1, {"e2"}, g);
add_edge(1, 2, {"e3"}, g);
add_edge(2, 0, {"e4"}, g);
write_graphviz(std::cout, g,
make_label_writer(get(&VertexProps::name, g)),
make_label_writer(get(&EdgeProps::name, g)));
}
为了完整起见,这里是 sehe 使用自定义 属性 作者对解决方案的修改。请不要忘记对原始答案进行投票。
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
struct VertexProps { std::string name; };
struct EdgeProps { std::string name; };
typedef boost::adjacency_list<boost::listS, boost::listS, boost::directedS, VertexProps, EdgeProps> Graph;
template <class Name>
class my_label_writer {
public:
my_label_writer(Name _name) : name(_name) {}
template <class VertexOrEdge>
void operator()(std::ostream& out, const VertexOrEdge& v) const {
out << "[label=\"" << name[v].name << "\"]";
}
private:
Name name;
};
int main() {
Graph g;
Graph::vertex_descriptor v0 = add_vertex({"one"}, g);
Graph::vertex_descriptor v1 = add_vertex({"two"}, g);
Graph::vertex_descriptor v2 = add_vertex({"three"}, g);
add_edge(v1, v0, {"e1"}, g);
add_edge(v2, v1, {"e2"}, g);
add_edge(v1, v2, {"e3"}, g);
add_edge(v2, v0, {"e4"}, g);
std::map<Graph::vertex_descriptor, int> vertex_index;
for (auto vd : boost::make_iterator_range(vertices(g)))
vertex_index[vd] = vertex_index.size();
my_label_writer<Graph> w(g);
write_graphviz(std::cout, g,
w,
make_label_writer(get(&EdgeProps::name, g)),
boost::default_writer{}, // graph_property_writer
boost::make_assoc_property_map(vertex_index));
}
对于listS
,顶点描述符类型不是整数,因此不适合作为顶点索引。
您现在需要使用实际的描述符:
Graph g;
Graph::vertex_descriptor v0 = add_vertex({"one"}, g);
Graph::vertex_descriptor v1 = add_vertex({"two"}, g);
Graph::vertex_descriptor v2 = add_vertex({"three"}, g);
add_edge(v1, v0, {"e1"}, g);
add_edge(v2, v1, {"e2"}, g);
add_edge(v1, v2, {"e3"}, g);
add_edge(v2, v0, {"e4"}, g);
此外,在写作时,您必须提供 vertex_index
属性 地图。这顺便要求你通过 graph_property_writer
备考:
std::map<Graph::vertex_descriptor, int> vertex_index;
for (auto vd : boost::make_iterator_range(vertices(g)))
vertex_index[vd] = vertex_index.size();
write_graphviz(std::cout, g,
make_label_writer(get(&VertexProps::name, g)),
make_label_writer(get(&EdgeProps::name, g)),
boost::default_writer{}, // graph_property_writer
boost::make_assoc_property_map(vertex_index));
演示
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
struct VertexProps { std::string name; };
struct EdgeProps { std::string name; };
typedef boost::adjacency_list<boost::listS, boost::listS, boost::directedS, VertexProps, EdgeProps> Graph;
int main() {
Graph g;
Graph::vertex_descriptor v0 = add_vertex({"one"}, g);
Graph::vertex_descriptor v1 = add_vertex({"two"}, g);
Graph::vertex_descriptor v2 = add_vertex({"three"}, g);
add_edge(v1, v0, {"e1"}, g);
add_edge(v2, v1, {"e2"}, g);
add_edge(v1, v2, {"e3"}, g);
add_edge(v2, v0, {"e4"}, g);
std::map<Graph::vertex_descriptor, int> vertex_index;
for (auto vd : boost::make_iterator_range(vertices(g)))
vertex_index[vd] = vertex_index.size();
write_graphviz(std::cout, g,
make_label_writer(get(&VertexProps::name, g)),
make_label_writer(get(&EdgeProps::name, g)),
boost::default_writer{}, // graph_property_writer
boost::make_assoc_property_map(vertex_index));
}
版画
digraph G {
0[label=one];
1[label=two];
2[label=three];
1->0 [label=e1];
1->2 [label=e3];
2->1 [label=e2];
2->0 [label=e4];
}
我从 我发现由于缺少索引 非常感谢。 } 为了完整起见,这里是 sehe 使用自定义 属性 作者对解决方案的修改。请不要忘记对原始答案进行投票。 make_label_writer(get(&VertexProps::name, g))
不起作用。谁能告诉我应该如何更改代码才能使其正常工作。我更喜欢使用自定义 属性 编写器的解决方案。 #include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
struct VertexProps { std::string name; };
struct EdgeProps { std::string name; };
typedef boost::adjacency_list<boost::listS, boost::listS, boost::directedS, VertexProps, EdgeProps> Graph;
int main() {
Graph g(3);
g[0].name = "one";
g[1].name = "two";
g[2].name = "three";
add_edge(1, 0, {"e1"}, g);
add_edge(2, 1, {"e2"}, g);
add_edge(1, 2, {"e3"}, g);
add_edge(2, 0, {"e4"}, g);
write_graphviz(std::cout, g,
make_label_writer(get(&VertexProps::name, g)),
make_label_writer(get(&EdgeProps::name, g)));
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
struct VertexProps { std::string name; };
struct EdgeProps { std::string name; };
typedef boost::adjacency_list<boost::listS, boost::listS, boost::directedS, VertexProps, EdgeProps> Graph;
template <class Name>
class my_label_writer {
public:
my_label_writer(Name _name) : name(_name) {}
template <class VertexOrEdge>
void operator()(std::ostream& out, const VertexOrEdge& v) const {
out << "[label=\"" << name[v].name << "\"]";
}
private:
Name name;
};
int main() {
Graph g;
Graph::vertex_descriptor v0 = add_vertex({"one"}, g);
Graph::vertex_descriptor v1 = add_vertex({"two"}, g);
Graph::vertex_descriptor v2 = add_vertex({"three"}, g);
add_edge(v1, v0, {"e1"}, g);
add_edge(v2, v1, {"e2"}, g);
add_edge(v1, v2, {"e3"}, g);
add_edge(v2, v0, {"e4"}, g);
std::map<Graph::vertex_descriptor, int> vertex_index;
for (auto vd : boost::make_iterator_range(vertices(g)))
vertex_index[vd] = vertex_index.size();
my_label_writer<Graph> w(g);
write_graphviz(std::cout, g,
w,
make_label_writer(get(&EdgeProps::name, g)),
boost::default_writer{}, // graph_property_writer
boost::make_assoc_property_map(vertex_index));
}
对于listS
,顶点描述符类型不是整数,因此不适合作为顶点索引。
您现在需要使用实际的描述符:
Graph g;
Graph::vertex_descriptor v0 = add_vertex({"one"}, g);
Graph::vertex_descriptor v1 = add_vertex({"two"}, g);
Graph::vertex_descriptor v2 = add_vertex({"three"}, g);
add_edge(v1, v0, {"e1"}, g);
add_edge(v2, v1, {"e2"}, g);
add_edge(v1, v2, {"e3"}, g);
add_edge(v2, v0, {"e4"}, g);
此外,在写作时,您必须提供 vertex_index
属性 地图。这顺便要求你通过 graph_property_writer
备考:
std::map<Graph::vertex_descriptor, int> vertex_index;
for (auto vd : boost::make_iterator_range(vertices(g)))
vertex_index[vd] = vertex_index.size();
write_graphviz(std::cout, g,
make_label_writer(get(&VertexProps::name, g)),
make_label_writer(get(&EdgeProps::name, g)),
boost::default_writer{}, // graph_property_writer
boost::make_assoc_property_map(vertex_index));
演示
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
struct VertexProps { std::string name; };
struct EdgeProps { std::string name; };
typedef boost::adjacency_list<boost::listS, boost::listS, boost::directedS, VertexProps, EdgeProps> Graph;
int main() {
Graph g;
Graph::vertex_descriptor v0 = add_vertex({"one"}, g);
Graph::vertex_descriptor v1 = add_vertex({"two"}, g);
Graph::vertex_descriptor v2 = add_vertex({"three"}, g);
add_edge(v1, v0, {"e1"}, g);
add_edge(v2, v1, {"e2"}, g);
add_edge(v1, v2, {"e3"}, g);
add_edge(v2, v0, {"e4"}, g);
std::map<Graph::vertex_descriptor, int> vertex_index;
for (auto vd : boost::make_iterator_range(vertices(g)))
vertex_index[vd] = vertex_index.size();
write_graphviz(std::cout, g,
make_label_writer(get(&VertexProps::name, g)),
make_label_writer(get(&EdgeProps::name, g)),
boost::default_writer{}, // graph_property_writer
boost::make_assoc_property_map(vertex_index));
}
版画
digraph G {
0[label=one];
1[label=two];
2[label=three];
1->0 [label=e1];
1->2 [label=e3];
2->1 [label=e2];
2->0 [label=e4];
}