【问题标题】:Boost Graph identifying verticesBoost Graph识别顶点
【发布时间】:2013-05-24 13:25:19
【问题描述】:

我需要将 Boost Graph 中的顶点映射到无符号整数。我从这个网站上的相关帖子(12)中了解到,正确的方法是创建一个自定义顶点类。

struct Vertex { uint32_t index; };
typedef boost::adjacency_list<boost::vecS, boost::vecS,
    boost::directedS, Vertex> BoostGraphType;    

typedef BoostGraphType::vertex_descriptor vertex_desc;

// now i can use
BoostGraphType g; 

vertex_desc vd = boost::add_vertex(g);
g[vd].index = magic;

但是,根据文档 (Iterator and Descriptor Stability/Invalidation),顶点描述符可能会变得无效,这意味着我不应该存储它们来映射顶点。

由于我有我的自定义顶点类 + .index,这应该不是问题。

但是:我以后如何检索特定索引的 vertex_descriptor?如果没有线性搜索,我怎么能做到这一点?

或者有没有比这样的自定义顶点类更好的方法来为每个顶点保留一个持久的 id?

【问题讨论】:

    标签: performance boost boost-graph


    【解决方案1】:

    当您的图形是adjacency_list&lt;boost::vecS, boost::vecS, ... 时,顶点描述符是整数。删除顶点时,某些顶点描述符可能会变得无效;同样,当您删除一条边时,某些边描述符会变得无效。如果您从不删除图形元素,那么这些整数描述符仍然有效。

    正如 BGL 文档所述,“如果您希望顶点和边描述符稳定(永不失效),请使用 listS 或 setS 作为 adjacency_list 的 VertexList 和 OutEdgeList 模板参数。”。

    请注意,如果您使用 adjacency_list&lt;boost::listS,...,您可能需要付出额外的努力来生成和更新名为 vertex_index 的属性。没有它,许多算法将无法工作。在此处查看更多详细信息https://stackoverflow.com/a/19758844/2876861

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2019-10-20
      相关资源
      最近更新 更多