[英]std::list c++ is sequential then how it can take constant time for insert and erase operations anywhere within the sequence
在c ++參考文獻中我讀到“列表是序列容器,它允許在序列中的任何地方進行恆定時間插入和擦除操作,並在兩個方向上進行迭代。” 我懷疑的是,如果它是順序的,那么如何花費恆定的時間來刪除和插入節點。任何方式我們必須順序遍歷以到達該節點。 刪除節點取決於其位置
O(1)指的是插入/擦除節點的復雜性,前提是您已經有一個句柄(以迭代器的形式)到該節點 。 給定第一個迭代器的列表的第i個元素的迭代器是O(N)。
在判斷std::list
與std::vector
的相對優點時,經常會忽略這一點。 但請注意,插入和擦除元素都返回可用於進一步插入/擦除操作的迭代器。
在給定節點之前插入(讓我們稱之為pos
)或作為最后一個節點或刪除給定節點是一個恆定時間操作。
std::list
可以實現為雙向鏈表。 序列容器不應與連續的內存要求混淆。
因為列表沒有排序。 如果仔細觀察,將元素放入列表的實際函數是list::insert(hint, element)
( http://www.cplusplus.com/reference/list/list/insert/ )。 即,對於每次插入,添加元素的位置是已知的,因此是恆定的時間。
例如list::push_front(element)
是insert(begin(), element)
縮寫。
[這主要是一個評論,但它不符合邊際]
請注意, 無法將std::list
實現為單個鏈表以滿足復雜性要求:
這就是為什么std::forward_list
只提供insert_after
和erase_after
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.