簡體   English   中英

std::map 范圍擦除復雜度

[英]std::map range erase complexity

cppreference.comstd::map范圍擦除的復雜性是:

log(c.size()) + std::distance(first, last)

而迭代器對單個元素的擦除是攤銷常數。 因此,如果我在循環中擦除元素:

for( auto it = first; it != last; it = map.erase( it ) );

這在std::distance(first, last)上應該是線性的, cplusplus.com同意這一點。 標准說什么? 這只是 cppreference.com 上的錯字嗎?

log(c.size()) + std::distance(first, last)

當 (first,last) 是整個范圍時,這是更大的因素,所以這簡化為std::distance(first, last) ,它是線性的,所以這與您的想法一致。

it = map.erase( it )攤銷常數。 它是恆定的,加上一點點用於遍歷和平衡。 當你在n次迭代中將所有這些偶然的小位加在一起時,它們總和在log(c.size()) 您仍然必須將這些添加到n恆定時間擦除本身,總共log(c.size()) + std::distance(first, last)

在任何一種情況下,你想要使用的是map.clear() ,它是O(n)與一個非常小的常數。 它比一次擦除一個要快得多,因為它可以跳過平衡。

我只有草稿,但它們與草稿一致:

a.擦除(q1,q2)

擦除[q1, q2) ... 范圍內的所有元素

復雜度: log(a.size()) + N其中 N 的值為distance(q1, q2)

n4594第 818 頁。

暫無
暫無

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

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