Boost Graph 通过 vertex_descriptor 访问属性

Nee*_*asu 4 c++ boost graph boost-graph

我有我的自定义顶点和边属性

namespace boost { 
    enum vertex_diagonal_t{vertex_diagonal = 999};
    BOOST_INSTALL_PROPERTY(vertex, diagonal);
}
namespace boost { 
    enum edge_dominance_t{edge_dominance = 998};
    BOOST_INSTALL_PROPERTY(edge, dominance);
}
Run Code Online (Sandbox Code Playgroud)

我创建我的邻接列表 boost::property

typedef boost::adjacency_list<
      boost::listS, 
      boost::vecS,
      boost::bidirectionalS,
      boost::property<boost::vertex_diagonal_t, const khut::diagonal*>,
      boost::property<boost::edge_dominance_t,  float>
    > diagonal_dominance_graph;
typedef boost::property_map<diagonal_dominance_graph, boost::vertex_diagonal_t>::type diagonal_map_type;
typedef boost::property_map<diagonal_dominance_graph, boost::edge_dominance_t>::type  dominance_map_type;
Run Code Online (Sandbox Code Playgroud)

现在我想遍历我自己的容器并添加顶点

diagonal_dominance_graph graph;
  for(storage_type::const_iterator i = repo_begining.begin(); i != repo_begining.end(); ++i){
    diagonal_dominance_graph::vertex_descriptor dia_vertex = boost::add_vertex(graph);

    //>> ?? HOW CAN I write Properties to dia_vertex HERE ?

    //boost::property<boost::vertex_diagonal_t, const khut::diagonal*> p;
    //boost::put(p, dia_vertex);

  }
Run Code Online (Sandbox Code Playgroud)

我没有得到的是如何通过vertex_descriptor. 可能是我缺少一个简单的功能。

请我不需要任何使 BGL 变得更加复杂的东西,或者在我的示例中清理和重组类型的东西。我只需要知道如何通过vertex_descriptoredge_descriptor

seh*_*ehe 5

您正在使用属性列表:它们在此处记录

所以在你的例子中,你会使用

diagonal_map_type  vp = get(boost::vertex_diagonal, graph);

using storage_type = std::vector<int>;
storage_type repo_begining(10);

for(storage_type::const_iterator i = repo_begining.begin(); i != repo_begining.end(); ++i) {
    diagonal_dominance_graph::vertex_descriptor dia_vertex = boost::add_vertex(graph);


    khut::diagonal* v = nullptr;
    boost::put(vp, dia_vertex, v);
}

// likewise for edges
dominance_map_type ep = get(boost::edge_dominance, graph);
Run Code Online (Sandbox Code Playgroud)

在 Coliru 上观看直播

捆绑属性

相同的文档页面说:

注意:Boost Graph Library 支持两种可互换的方法来指定内部属性:捆绑属性和属性列表。前者更易于使用且需要更少的努力,而后者与旧的、损坏的编译器兼容,并且向后兼容 1.32.0 之前的 Boost 版本。如果您绝对需要这些兼容性功能,请继续阅读以了解属性列表。否则,我们强烈建议您阅读有关捆绑属性机制的信息。

提升 10 年前的 1.32 日期!所以,我建议捆绑属性:

Live On Coliru

#include <boost/graph/adjacency_list.hpp>

namespace khut {
    struct diagonal { };

    struct MyVertexProperties {
        diagonal const* diag_ptr;
    };

    struct MyEdgeProperties {
        float dominance;
    };
}

typedef boost::adjacency_list<
      boost::listS, 
      boost::vecS,
      boost::bidirectionalS,
      khut::MyVertexProperties,
      khut::MyEdgeProperties
    > diagonal_dominance_graph;

#include <iostream>


int main() {
    using namespace boost;

    diagonal_dominance_graph g;

    khut::diagonal d1, d2;
    {
        auto v1 = add_vertex(khut::MyVertexProperties { &d1 }, g);
        auto v2 = add_vertex(khut::MyVertexProperties { &d2 }, g);

        /*auto e1 = */add_edge(v1, v2, khut::MyEdgeProperties { 42.31415926 }, g);
    }

    for(diagonal_dominance_graph::vertex_descriptor vd : make_iterator_range(vertices(g)))
        std::cout << "Is diagonal d1? " << std::boolalpha << (&d1 == g[vd].diag_ptr) << "\n";
    for(diagonal_dominance_graph::edge_descriptor ed : make_iterator_range(edges(g)))
        std::cout << "Edge dominance: " << g[ed].dominance << "\n";
}
Run Code Online (Sandbox Code Playgroud)

印刷

Is diagonal d1? true
Is diagonal d1? false
Edge dominance: 42.3142
Run Code Online (Sandbox Code Playgroud)