簡體   English   中英

Boost Graph Library:頂點描述符一定是唯一的嗎?

[英]Boost Graph Library: Are Vertex Descriptors Necessarily Unique?

我意識到這可能是迂腐的,但是 BGL 頂點描述符總是唯一的嗎? 對於背景,我有以下圖形定義:

typedef boost::adjacency_list<boost::setS, boost::listS, boost::undirectedS, VProp, EProp> Graph;

我在哪里使用listS作為節點數據結構。 我知道這使我的描述符(看起來是void*類型)“穩定”:當從圖中刪除節點時,仍然可以使用其他節點的其他描述符。

不過,我已經瀏覽了 BGL 文檔,但無法保證這些描述符是唯一的 本質上,我想知道兩個描述符是否==當且僅當它們指向的底層節點數據相同時。 換句話說,直接比較描述符是檢查節點相等性的有效方法嗎?

顯然,當節點數據結構為vecS時這是正確的(因為在這種情況下描述符是索引),但我在 BGL 文檔中沒有找到listS的任何信息。

提前致謝

到標題:

頂點描述符一定是唯一的嗎?

是的。

換句話說,直接比較描述符是檢查節點相等性的有效方法嗎?

是的。

顯然,當節點數據結構為 vecS 時,這是正確的

確切地。 我只是要給出這個確切的例子來給出部分證明。 這說明你對庫的理解已經相當深入了。

我碰巧對代碼進行了更深入的研究,並且知道在基於節點的頂點容器選擇器(listS、setS 等)的情況下的描述符類型。 將相當於對該(實現定義的)容器中元素的直接引用的類型擦除版本。

請注意,元素的實際類型將根據模板 arguments 的許多不同而有所不同,這就是為什么描述符被強制轉換為不透明void*所以

  1. 用戶代碼不必知道具體的內部結構
  2. 用戶代碼不能(意外)通過描述符濫用這些內部結構

鑒於這種性質,我們可以同時解釋穩定性(它與底層容器實現的參考穩定性相匹配)和唯一性保證(描述符標識與(頂點)存儲容器中元素的 object 標識一致)。

注意這個答案只會您放心adjacency_list<>實例化的情況。 還有其他 Graph 模型。 我碰巧知道大多數人都有非常相似的保證,其證明基本上遵循相同的結構。


我尚未(尚未)仔細檢查文檔以驗證您聲稱它是無證的,並且我不相信添加明確的保證會有所幫助,但我建議您提出這個問題。 對於 (C++) 程序員來說,這是一個好習慣。

暫無
暫無

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

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