【问题标题】:Find Boost BGL vertex by a key通过键查找 Boost BGL 顶点
【发布时间】:2011-01-15 17:16:06
【问题描述】:

我正在寻找一种通过使用键而不是顶点引用本身来访问顶点属性的方法。 例如,如果我有

class Data
{
  public:
    std::string  name;
    unsigned int value; 
}; 
typedef boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, Data > Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;

而不是使用

Vertex vertex1 = boost::add_vertex( g );
g[vertex1].name  = "Alpha";
g[vertex1].value = 10;

我想要

g["Alpha"].name  = "Alpha";
g["Alpha"].value = 10;

是否存在即用型机制?

【问题讨论】:

    标签: c++ boost graph boost-graph


    【解决方案1】:

    我想我已经找到了这样的机制。它被称为labeled_graph,是BGL 的一部分。 可以使用预定义的包装器 labeled_graph,而不是使用 adjacency_list

    typedef boost::labeled_graph<
        boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, Data >,
        std::string
    > Graph;
    

    这样定义图后,可以通过以下方式访问顶点:

    Graph g;
    
    boost::add_vertex( "Alpha", g );
    g["Alpha"].name  = "Alpha";
    g["Alpha"].value = 10;
    
    boost::add_vertex( "Beta", g );
    g["Beta"].name  = "Beta";
    g["Beta"].value = 20;
    
    boost::add_edge_by_label( "Alpha", "Beta", g );
    

    这样做的副作用是需要使用 graph() 成员函数来使某些算法起作用:

    std::vector< Graph::vertex_descriptor > container;
    boost::topological_sort( g.graph(), std::back_inserter( container ) ) ;
    

    由于某种原因,labeled_graph 没有在 BGL 文档中描述,但它出现在示例文件夹中。

    感谢您的回复, 塞尔吉

    【讨论】:

    • 查看labeled_graph.hpp适配器的历史,看起来文件比较新。 (开始出现在 Boost 库版本 1.40 中)。可能这就是为什么它还不是文档的一部分,
    【解决方案2】:

    不存在即用型机制,因为adjacency_list 概念无法知道您想通过结构中的字段访问顶点属性。

    我更喜欢有一个附加映射的方式,它将数据的名称映射到相应的顶点。此外,您可以将算法封装在类或函数中,以便在添加新顶点时自动填充地图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 2019-10-20
      • 2020-05-03
      • 2023-03-20
      相关资源
      最近更新 更多