簡體   English   中英

Boost Graph Library:如何保持對頂點的永久引用? (即不受頂點重新編號)

[英]Boost Graph Library: How do I keep a permanant reference to a vertex? (i.e. not subject to vertex re-numbering)

假設我要保留對頂點的引用。 例如在有限狀態機中,我要標記開始狀態和最終狀態。 首先想到的是Graph:vertex_descriptor。 但是,它是一個無符號的int值,如果從圖中刪除了一個頂點,則可以對其余的頂點重新編號。

因此,保留不被頂點移除的頂點的參考的好方法是什么(當然,除非被參考的頂點本身被移除)。 謝謝!

如果您參考表“描述符和迭代器無效的摘要”。 這個頁面 ,你會看到,頂點描述符中的頂點清除只能作廢,如果你使用vecS作為VertexList模板參數adjacency_list 您希望頂點描述符永遠不會失效(除非它們是被刪除的),您應該改用listS (或vecS以外的其他任何描述符,盡管對於頂點,最好只使用listS )。

在某些情況下,我在適用時使用的另一種可能性是,將不想使兩個無效的(開始,最終)頂點放置在圖的開始處(您添加到圖中的前兩個頂點) )。 當您執行此操作時,即使使用vecS ,頂點的移除也不會移動第一個頂點的位置(僅會移除移除頂點之后的頂點)。 但是,這是一個hack,您不應該過多地依賴此技巧。

我還實現了對adjacency_list類的替代,該類還包括池容器的選項,該容器具有vecS大多數優點(例如局部性),但在各處保留了頂點描述符。 您可以簽出 ,但要注意,它尚未完全投入生產。

至於選擇引用頂點的方式..答案始終是vertex_descriptor 其他什么都不是真正安全的。 迭代器僅用於遍歷,不能用作“指針”。

編輯:如果您需要在通用函數的上下文中測試特定的Graph類型是否具有“持久”頂點描述符,我不知道對此有任何直接測試,但是您可以檢查迭代器類別在頂點迭代器上。 如果迭代器類別是“隨機訪問”,則最通常意味着頂點描述符不是持久性的(可以通過刪除使其無效)。 通過迭代器類別,我的意思是從std::iterator_traits獲得vertex_iterator的特征。 我想這也是一個小技巧,但這是相當安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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