【问题标题】:BGL: How to get custom vertex properties class instance from vertex iterator?BGL:如何从顶点迭代器获取自定义顶点属性类实例?
【发布时间】:2014-10-21 20:40:08
【问题描述】:

我正在学习使用 Boost Graph Library。我已经定义了一个自定义结构来存储有关顶点的信息,如下所示:Modifying vertex properties in a Boost::Graph

struct VertexProperties {
    int attribute1; 
    string attribute2;
    }; 
typedef adjacency_list<vecS, vecS, directedS, VertexProperties, no_property> Graph; 

我可以像这样迭代图顶点并修改它们的属性:

for (int i = 0; i < num_vertices(g); i++)
{
    g[i].attribute1 = 123; 
    g[i].attribute2 = "123";
} 

但是当我只有一个顶点迭代器时,我如何真正获得这些属性(即 VertexProperties 的相应实例)?

GraphTraits::vertex_iterator vert_i, vert_end;
for (tie(vert_i, vert_end) = vertices(g); vert_i != vert_end; ++vert_i){
    //how do i get to "vert_i.attribute1" ?
}

同样的问题也适用于边和边迭代器。这应该很容易,但我似乎无法在 BGL 文档或其他任何地方找到它。

感谢您的帮助。

【问题讨论】:

  • g[*vert_i].attribute1?
  • 不,我已经尝试过了。不工作。

标签: c++ boost


【解决方案1】:

使用g[*vert_i].attribute1 应该可以。这是指定的方式,并且确实有效。如果您查看bundled properties 上的文档页面,它会说:

要访问特定边或顶点的捆绑属性,请使用您希望访问其捆绑属性的边或顶点的描述符下标您的图形。 p>

他们举了一个例子:

Graph g;
Graph::vertex_descriptor v = *vertices(g).first;
g[v].name = "Troy";

vertex_iterator 类型应该取消引用到 vertex_descriptor,您应该使用它来下标到图中 (g[v])。因此,使用g[*vert_i].attribute1 绝对可以。如果没有,这是您需要在跟踪器上提交的错误。

因此,这也意味着您使用 g[i].attribute1 的原始代码不正确,因为不能保证整数索引与该图的 vertex_descriptor 类型相同(它恰好可以工作,因为您使用vecS 作为VertexList 参数,这使得vertex_descriptor 成为一个整数,但它不一定是,即使使用vecS)。您应该只使用 vertex_descriptor 对象来索引到图中。此外,如果您的g[i] 代码有效,那么g[*vert_i] 也应该有效,除非存在严重的错误,否则根本不可能有一个工作而另一个不能工作。

但是请注意,我知道捆绑属性在某些情况下会被禁用。特别是,它使用了一些编译器可能不支持的技术,这意味着旧的或外来的编译器可能无法完成这项工作。这是一个缺陷,我希望将来能够通过一个替代实现来消除这个缺陷,该实现完全修改了当前的adjacency_list 类模板,但是这种剧烈的重新设计在一段时间之前不太可能将其纳入 BGL。

访问捆绑属性的另一种方法是使用它的属性映射,它有一些令人讨厌的语法,但可能有更大的工作机会。对于您的示例,它将是这样的:

boost::property_map<Graph, int VertexProperties::*>::type attr1 = 
  get(&VertexProperties::attribute1, g);

GraphTraits::vertex_iterator vert_i, vert_end;
for (tie(vert_i, vert_end) = vertices(g); vert_i != vert_end; ++vert_i){
  put(attr1, *vert_i, 123);
}

还有一个不受支持的功能(幕后)用于获取整个捆绑包的属性映射,但您不能使用它,因为它不是受支持接口的一部分。

【讨论】:

  • 好的。它现在有效,我第一次尝试时一定做错了什么。谢谢:-)
猜你喜欢
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 2021-07-08
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
相关资源
最近更新 更多