簡體   English   中英

BGL:如何從頂點迭代器獲取自定義頂點屬性類實例?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM