std :: map范围擦除复杂性

时间:2016-06-23 22:00:49

标签: c++ time-complexity stdmap

cppreference.com表示std::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上的错字吗?

2 个答案:

答案 0 :(得分:11)

log(c.size()) + std::distance(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)具有非常小的常量。它比一次擦除快得多,因为它可以跳过平衡。

答案 1 :(得分:3)

我只有草稿,但它们与草案一致:

  

a.erase(q1,q2)

     

删除范围[q1, q2) ...

中的所有元素      

复杂性: log(a.size())+ N 其中N的值为distance(q1, q2)

n4594 Page 818。