[英]What is the runtime complexity of `boost::edge()` on an adjacency_list with vecS?
[英]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
會導致邊緣迭代使邊緣描述符無效。
我是否正確理解了該表,因為它說“如果在directedS
的adjacency_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.