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上的错字吗?
答案 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。