如何将BGL的vertex_descriptor作为int访问

时间:2012-07-20 14:20:18

标签: c++ boost

我有一个邻接列表,如下所示。此时我需要访问vertex_descriptor作为int类型。我怎么能这样做tvertex source = ...; int source_as_int = ???source???我记得之前碰到过同样的问题并解决了它但是不记得BGL文档是如何使用它作为参考无用的,他们应该试着看看并学习Javadocs

另一种可能性是使用vertex_descriptor类型的可能成员函数或其他一些全局BGL函数用于此目的...一个人永远不知道在哪里寻找这个并且他们似乎在制作之间随机选择全局函数或成员函数,如果你问我,就会彻底失败。

typedef adjacency_list_traits<setS, setS, bidirectionalS> ttraits;

typedef adjacency_list<setS, setS, bidirectionalS,
        // vertex properties
        property<vertex_color_t, default_color_type>,
        // edge properties
        property<edge_capacity_t, int,
        property<edge_residual_capacity_t, int,
        property<edge_reverse_t, ttraits::edge_descriptor> > >, no_property, vecS> tbgl_adjlist_bidir;

typedef graph_traits<tbgl_adjlist_bidir>::vertex_descriptor     tvertex;
typedef graph_traits<tbgl_adjlist_bidir>::edge_descriptor       tedge;
typedef property_map<tbgl_adjlist_bidir, edge_capacity_t>::type tedge_capacity_map;
typedef property_map<tbgl_adjlist_bidir, edge_reverse_t>::type  treverse_edge_map;
typedef property_map<tbgl_adjlist_bidir, vertex_color_t>::type  tvertex_color_map;
typedef graph_traits<tbgl_adjlist_bidir>::out_edge_iterator     tout_edge_iterator;
typedef graph_traits<tbgl_adjlist_bidir>::in_edge_iterator      tin_edge_iterator;

3 个答案:

答案 0 :(得分:5)

好的,我明白了。添加顶点属性vertex_index_t可以解决问题。然后我可以像这样访问顶点的int索引:

typedef adjacency_list_traits<setS, vecS, bidirectionalS> ttraits;

typedef adjacency_list<setS, vecS, bidirectionalS,
        // vertex properties
        property<vertex_index_t, int,
        property<vertex_color_t, default_color_type> >,
        // edge properties
        property<edge_capacity_t, int,
        property<edge_residual_capacity_t, int,
        property<edge_reverse_t, ttraits::edge_descriptor> > >, no_property, vecS> tbgl_adjlist_bidir;

typedef graph_traits<tbgl_adjlist_bidir>::vertex_descriptor     tvertex;
typedef graph_traits<tbgl_adjlist_bidir>::edge_descriptor       tedge;
typedef property_map<tbgl_adjlist_bidir, edge_capacity_t>::type tedge_capacity_map;
typedef property_map<tbgl_adjlist_bidir, edge_reverse_t>::type  treverse_edge_map;
typedef property_map<tbgl_adjlist_bidir, vertex_color_t>::type  tvertex_color_map;
typedef property_map<tbgl_adjlist_bidir, vertex_index_t>::type  tvertex_index_map;
typedef graph_traits<tbgl_adjlist_bidir>::vertex_iterator       tvertex_iterator;
typedef graph_traits<tbgl_adjlist_bidir>::edge_iterator         tedge_iterator;
typedef graph_traits<tbgl_adjlist_bidir>::out_edge_iterator     tout_edge_iterator;
typedef graph_traits<tbgl_adjlist_bidir>::in_edge_iterator      tin_edge_iterator;

然后我像这样使用它:

    tbgl_adjlist_bidir bgl_adjlist_bidir;
    // ...
    tvertex_index_map indices = get(vertex_index, bgl_adjlist_bidir);
    // ...
    tvertex source; 
    // ...
    int source_as_int = indices[source];

答案 1 :(得分:1)

vertex_descriptor的类型取决于VertexListS的基础结构 - adjacency_list的模板参数。当VertexList-Type为int时,我知道的唯一情况是描述符是vecS。但请记住:如果选择vecS作为VertexList-Type,则所有(存储的)描述符都可能无效,当您更改图表的结构时(如Iterator and Descriptor Stability/Invalidation中所述)。

答案 2 :(得分:1)

我是否会对您使用自定义顶点和边缘类型感兴趣?它们在您自己的代码中非常多easier to work with。至于调用BGL算法,您可以使用Bundled Properties