代码之家  ›  专栏  ›  技术社区  ›  sAguinaga

使用vertex\u描述符boost图打印或迭代顶点

  •  4
  • sAguinaga  · 技术社区  · 7 年前

    构建一个boost图,其中添加的边区域(如下)和v1定义为

    gm->create_edge(v1,v2,1); 
    boost::graph_traits<Graph>::vertex_descriptor v1 = gm-> create_vertex("one",1,1);
    

    如何使用打印或枚举顶点?:

    boost::graph_traits<Graph>::vertex_descriptor vd;
    

    这允许我打印顶点id:

    Graph::vertex_iterator v, vend, vnext; 
    for (boost::tie(v, vend) = vertices(gm->g); v != vend; ++v)
        std::cout << gm->g[*v].id << ", "  << gm->g[*v].color << ", ";
    

    我有一个节点度的函数,它需要一个顶点描述符,那么,我如何传递它呢?

    gm->degree( takes vertex_descriptor )?
    

    links 很接近。

    1 回复  |  直到 7 年前
        1
  •  7
  •   sehe    7 年前

    vertices(g) 返回迭代器对。间接指向迭代器可以得到描述符。在你自己的例子中 v vertex_iterator 所以 *v vertex_descriptor .

    让我们使用Boost degree 函数-也采用描述符:

    Live On Coliru

    #include <boost/graph/adjacency_list.hpp>
    
    namespace MyProgram {
        using namespace boost;
        struct VertexProps { int id; default_color_type color; };
    
        using Graph = adjacency_list<vecS, vecS, directedS, VertexProps>;
    
        Graph make_sample_graph();
    }
    
    #include <iostream>
    
    int main() {
        using MyProgram::Graph;
        Graph g = MyProgram::make_sample_graph();
    
        Graph::vertex_iterator v, vend;
        for (boost::tie(v, vend) = vertices(g); v != vend; ++v) {
            std::cout << "Vertex descriptor #" << *v 
                 << " degree:" << degree(*v, g)
                 << " id:"     << g[*v].id
                 << " color:"  << g[*v].color
                 << "\n";
        }
    }
    

    但我更喜欢使用Range:

    Live On Coliru

    for (auto vd : boost::make_iterator_range(vertices(g))) {
        std::cout << "Vertex descriptor #" << vd 
             << " degree:" << degree(vd, g)
             << " id:"     << g[vd].id
             << " color:"  << g[vd].color
             << "\n";
    }
    

    完整性 make_sample_graph() :

    namespace MyProgram {
        Graph make_sample_graph() {
            Graph g(10);
            for (auto vd : boost::make_iterator_range(vertices(g)))
                g[vd] = { int(vd)*100, {} };
    
            add_edge(1,2,g);
            add_edge(2,3,g);
            add_edge(4,5,g);
            add_edge(4,6,g);
            add_edge(6,7,g);
    
            return g;
        }
    }
    

    打印:

    Vertex descriptor #0 degree:0 id:0 color:0
    Vertex descriptor #1 degree:1 id:100 color:0
    Vertex descriptor #2 degree:2 id:200 color:0
    Vertex descriptor #3 degree:1 id:300 color:0
    Vertex descriptor #4 degree:2 id:400 color:0
    Vertex descriptor #5 degree:1 id:500 color:0
    Vertex descriptor #6 degree:2 id:600 color:0
    Vertex descriptor #7 degree:1 id:700 color:0
    Vertex descriptor #8 degree:0 id:800 color:0
    Vertex descriptor #9 degree:0 id:900 color:0