簡體   English   中英

std :: list c ++是順序的,然后如何在序列中的任何位置進行插入和擦除操作的恆定時間

[英]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::liststd::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_aftererase_after

暫無
暫無

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

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