c++ - Boost Graph 通过 vertex_descriptor 访问属性

标签 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);
}

我使用 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;

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

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);

  }

我没有得到的是如何通过 vertex_descriptor 设置顶点的属性。可能是我缺少一个简单的功能。

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

读取/写入属性

最佳答案

您正在使用属性列表:它们是 documented here .

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

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);

查看 Live On Coliru

捆绑属性

同样的文档页面说:

NOTE: The Boost Graph Library supports two interchangeable methods for specifying interior properties: bundled properties and property lists. The former is easier to use and requires less effort, whereas the latter is compatible with older, broken compilers and is backward-compatible with Boost versions prior to 1.32.0. If you absolutely require these compatibility features, read on to learn about property lists. Otherwise, we strongly suggest that you read about the bundled properties mechanism.

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";
}

打印

Is diagonal d1? true
Is diagonal d1? false
Edge dominance: 42.3142

关于c++ - Boost Graph 通过 vertex_descriptor 访问属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28740974/

相关文章:

c++ - 交叉编译到 x86 时出现 libboost 系统链接器错误

c++ - 继承决议

c++ - gcc 3.4 上的 std::map 问题,使用 find 时在 std::less<unsigned> 中崩溃

c++ - 扩大多边形 boost::geometry

ios - 使用图表设置饼图的最大值和宽度

5亿(双)值的Java数据结构?

objective-c - 带核心图形的功能区图(图表)

c++ - 从另一个变量访问一个变量

c++ - 模板类和类属性也是模板

c++ - 使用 Boost.Thread 编译 C++ 源文件