簡體   English   中英

列表 - 復雜性

[英]stl list - complexity

列表的所有插入(任何位置)是否都是常量?

訪問怎么樣?

前,后 - 恆定時間?

在列表的中間 - 線性時間?

std::list中的任何位置插入是常量時間操作。

也就是說,在你可以插入之前,你需要獲得一個迭代器到你要插入的位置,這是一個線性時間操作,除非你在談論前面或后面。

http://www.sgi.com/tech/stl/List.html

列表是雙重鏈表。 也就是說,它是一個支持前向和后向遍歷的序列,以及(開始)(開始)常量時間插入和刪除元素的開始或結束,或中間。 列表具有重要的屬性,即插入和拼接不會使列表元素的迭代器無效,甚至刪除也只會使指向被刪除元素的迭代器無效

關於訪問,如果你要在中間的某個地方搜索一個元素,它將需要線性時間。 但是一旦你有了一個迭代器,它(當然)將是恆定的時間訪問,並且它不會被其他插入或刪除無效。

請注意,主要是由於更好的數據局部性,實際上std::vector通常比std::list更快 ,即使在理論上它應該是另一種方式。 所以默認的順序容器應該是std::vector

如果您有疑問, 首先要測量該容器是否至關重要 (如果該部分只占總時間的2%,則不會將代碼的速度提高十倍,然后將測量結果與std::list進行比較)和std::deque並做出你的選擇。

無論您在何處插入單個元素,將單個元素插入到std::list<>需要恆定的時間。 注意, std::list<>不是一個固有的有序容器,這意味着你指定了插入新元素的確切位置。 難怪,時間是線性的。

插入(“拼接”)從另一個列表移動到這個元素的[sub]元素序列 (即std::list<>::splice方法)需要恆定時間或線性時間(插入元素數量的線性)。 發生這種情況是因為std::list<>的實現可以選擇:

(1)在常量時間內實現std::list<>::size方法,並通過在線性時間內實現std::list<>::splice來支付它,或者

(2)在常量時間內實現std::list<>::splice方法,並通過在線性時間內實現std::list<>::size來支付它。

你可以擁有這個或那個,但你不能同時擁有這兩個。 遵循特定方法的決定取決於實施。

它由C ++標准23.2.2 / 1保證:

list是一種支持雙向迭代器的序列, 允許在序列中的任何位置進行恆定時間插入和擦除操作 ,並自動處理存儲管理。 與向量(23.2.4)和deques(23.2.1)不同,不支持對列表元素的快速隨機訪問,但是許多算法無論如何都只需要順序訪問。

暫無
暫無

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

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