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/28781894/

相关文章:

C++ 不 append 到文本文件

c++ - boost 日志记录类属性

c++ - Boost.asio使用协程实现多个连接的echo服务器

java - 如何使用 JFreeChart 固定自动范围避免负值

python - axhspan 使用坐标设置限制

c++ - C++中用for循环引用二维数组每一行的方法

c++ - 在连续内存块中动态创建二维数组

python - 树hackerrank解决错误的故事

c++ - 函数的多重定义

c++ - 我可以将成员函数传递给 mu::Parser::DefineFun() 吗?