当前位置:  开发笔记 > 编程语言 > 正文

修改Boost :: Graph中的顶点属性

如何解决《修改Boost::Graph中的顶点属性》经验,为你挑选了2个好方法。

我试图找出如何使用boost :: graph来存储一些信息.但是,我希望有关于每个顶点的信息.盯着库的文档揭示了(a)写得不好的文档,或者(b),我显然不像我想的那样擅长C++.选择两个.

我正在寻找一个简单的示例用法.



1> baol..:

使用捆绑属性怎么样?

using namespace boost;

struct vertex_info { 
    std::string whatever; 
    int othervalue; 
    std::vector some_values; 
};

typedef adjacency_list graph_t;

graph_t g(n);

g[0].whatever = "Vertex 0";

[...]

等等.

我经常使用BGL,使用捆绑属性非常简单(参见文档).

我经常使用的另一种顶点属性是外部属性.您可以声明std::vectors适当的大小,并在大多数时间和大多数算法中将它们用作属性.


这需要是公认的答案.特别是因为目前投票最高的竞争答案是重新实现了这个功能,你已经在图书馆中显示了!您的示例代码也是我在网上找到的关于如何设置简单的boost图库用法的最直接的示例.谢谢.

2> grefab..:

我不喜欢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 Graph MyGraph;

MyGraph g;

VertexProperties vp;
vp.i = 42;

MyGraph::Vertex v = g.AddVertex(vp);

g.properties(v).i = 23;

当然,您的图形结构可能还有其他需求,但上面代码的修改应该非常简单.


只是为了避免像我这样的新手出现问题.需要在代码的开头添加:#include #include #include #include #include #include using namespace boost; (我很抱歉这个可怕的评论)
推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有