[英]BGL: How to get custom vertex properties class instance from vertex iterator?
我正在學習使用Boost Graph Library。 我已經定義了一個自定義結構,用於存儲有關頂點的信息,如下所示: 在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
應該可以。 這是它指定的方式,它確實起作用。 如果查看捆綁屬性的文檔頁面,它會顯示:
要訪問特定邊或頂點的捆綁屬性,請用要訪問其捆綁屬性的邊或頂點的描述符 下標圖形。
他們舉了一個例子:
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);
}
還有一個不支持的功能(在后台),用於獲取整個包的屬性映射,但是您不能使用它,因為它不是受支持的接口的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.