簡體   English   中英

為什么使用 vecS 作為 OutEdgeList 模板參數的 boost adjacency_list 在遍歷時使邊無效?

[英]Why does a boost adjacency_list using vecS as OutEdgeList template parameter invalidate edges on traversal?

我正在閱讀有關adjacency_list的文檔以及選擇圖形類型對 memory 消耗、big-O 運行時和描述符穩定性的影響。

引用第一個鏈接:

下表總結了哪些操作會導致描述符和迭代器失效。 表中EL是OutEdgeList的縮寫,VL是VertexList的縮寫。 Adj Iter 類別包括 out_edge_iterator、in_edge_iterator 和 adjacency_iterator 類型。
描述符和迭代器失效的更詳細描述在每個操作的文檔中給出。
表:描述符和迭代器失效總結

我知道如果對VertexList使用vecS ,那么在remove_vertex()上所有頂點描述符都將被調整,以便它們仍然是連續的。

我不明白為什么顯然使用vecS會導致邊緣迭代使邊緣描述符無效。

我是否正確理解了該表,因為它說“如果在directedSadjacency_list圖上使用vecS作為邊列表類型,那么您不能穩定地迭代邊,因為迭代它們會使邊迭代器和邊描述符無效” ?

如果我確實理解正確,請解釋為什么會這樣。 如果我理解有誤,請說明使用vecS for Edge List的實際效果。
謝謝你。

正如您所懷疑的那樣,您誤讀了它。

令人困惑的是列“Edge Iter”、“Vertex Iter”和“Adj Iter”是“Iterator”的縮寫,而不是“iteration”。

單純的迭代行為永遠不會改變adjacency_list ,因此不能使描述符或迭代器無效。

在圖模型中,描述符比迭代器(迭代器)更穩定。這實際上是描述符概念的關鍵原因。任何具有引用穩定性的容器選擇器(即基於節點的容器)自然會具有迭代器穩定性(僅使迭代器無效到擦除的節點)。

該表很有用,因為對於“不可變”(或很少更改,經常查詢)圖的性能,可以通過選擇連續存儲(如 vecS)來大大增強,並且它們自然會施加更多限制性的無效規則(例如,向量可能會重新分配,從而使無效所有迭代器,但描述符可能在修改/插入索引之前保持穩定)。

提示

要對基本失效問題進行原始編譯時檢查,請考慮通過 const 引用獲取圖表。 這將消除意外修改的機會。 當然,在某些情況下,您真的想走邊緣(為了性能)您想要對圖形執行修改,並且您必須每次使用文檔以確切了解適用於該修改的無效規則。

暫無
暫無

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

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