我试图找出如何使用boost :: graph来存储一些信息.但是,我希望有关于每个顶点的信息.盯着库的文档揭示了(a)写得不好的文档,或者(b),我显然不像我想的那样擅长C++.选择两个.
我正在寻找一个简单的示例用法.
使用捆绑属性怎么样?
using namespace boost; struct vertex_info { std::string whatever; int othervalue; std::vectorsome_values; }; typedef adjacency_list graph_t; graph_t g(n); g[0].whatever = "Vertex 0"; [...]
等等.
我经常使用BGL,使用捆绑属性非常简单(参见文档).
我经常使用的另一种顶点属性是外部属性.您可以声明std::vectors
适当的大小,并在大多数时间和大多数算法中将它们用作属性.
我不喜欢boost :: graph的嵌套模板属性方法,因此我在所有内容周围编写了一个小包装器,它基本上允许将任何struct /类作为顶点/边属性.可以访问访问struct成员的属性.
为了保持灵活性,这些结构被定义为模板参数.
这里的代码:
/* definition of basic boost::graph properties */ enum vertex_properties_t { vertex_properties }; enum edge_properties_t { edge_properties }; namespace boost { BOOST_INSTALL_PROPERTY(vertex, properties); BOOST_INSTALL_PROPERTY(edge, properties); } /* the graph base class template */ template < typename VERTEXPROPERTIES, typename EDGEPROPERTIES > class Graph { public: /* an adjacency_list like we need it */ typedef adjacency_list< setS, // disallow parallel edges listS, // vertex container bidirectionalS, // directed graph property, property > GraphContainer; /* a bunch of graph-specific typedefs */ typedef typename graph_traits ::vertex_descriptor Vertex; typedef typename graph_traits ::edge_descriptor Edge; typedef std::pair EdgePair; typedef typename graph_traits ::vertex_iterator vertex_iter; typedef typename graph_traits ::edge_iterator edge_iter; typedef typename graph_traits ::adjacency_iterator adjacency_iter; typedef typename graph_traits ::out_edge_iterator out_edge_iter; typedef typename graph_traits ::degree_size_type degree_t; typedef std::pair adjacency_vertex_range_t; typedef std::pair out_edge_range_t; typedef std::pair vertex_range_t; typedef std::pair edge_range_t; /* constructors etc. */ Graph() {} Graph(const Graph& g) : graph(g.graph) {} virtual ~Graph() {} /* structure modification methods */ void Clear() { graph.clear(); } Vertex AddVertex(const VERTEXPROPERTIES& prop) { Vertex v = add_vertex(graph); properties(v) = prop; return v; } void RemoveVertex(const Vertex& v) { clear_vertex(v, graph); remove_vertex(v, graph); } EdgePair AddEdge(const Vertex& v1, const Vertex& v2, const EDGEPROPERTIES& prop_12, const EDGEPROPERTIES& prop_21) { /* TODO: maybe one wants to check if this edge could be inserted */ Edge addedEdge1 = add_edge(v1, v2, graph).first; Edge addedEdge2 = add_edge(v2, v1, graph).first; properties(addedEdge1) = prop_12; properties(addedEdge2) = prop_21; return EdgePair(addedEdge1, addedEdge2); } /* property access */ VERTEXPROPERTIES& properties(const Vertex& v) { typename property_map ::type param = get(vertex_properties, graph); return param[v]; } const VERTEXPROPERTIES& properties(const Vertex& v) const { typename property_map ::const_type param = get(vertex_properties, graph); return param[v]; } EDGEPROPERTIES& properties(const Edge& v) { typename property_map ::type param = get(edge_properties, graph); return param[v]; } const EDGEPROPERTIES& properties(const Edge& v) const { typename property_map ::const_type param = get(edge_properties, graph); return param[v]; } /* selectors and properties */ const GraphContainer& getGraph() const { return graph; } vertex_range_t getVertices() const { return vertices(graph); } adjacency_vertex_range_t getAdjacentVertices(const Vertex& v) const { return adjacent_vertices(v, graph); } int getVertexCount() const { return num_vertices(graph); } int getVertexDegree(const Vertex& v) const { return out_degree(v, graph); } /* operators */ Graph& operator=(const Graph &rhs) { graph = rhs.graph; return *this; } protected: GraphContainer graph; };
使用此功能,您可以访问以下属性:
struct VertexProperties { int i; }; struct EdgeProperties { }; typedef GraphMyGraph; MyGraph g; VertexProperties vp; vp.i = 42; MyGraph::Vertex v = g.AddVertex(vp); g.properties(v).i = 23;
当然,您的图形结构可能还有其他需求,但上面代码的修改应该非常简单.