unordered_map重新擦除擦除()

时间:2016-05-27 15:36:18

标签: c++ c++11 unordered-map erase-remove-idiom

在完成unordered_map

时,我不清楚是否允许erase()执行重组操作

很明显,在insert()期间可能会发生重新散列,从而使所有迭代器和引用无效:

http://en.cppreference.com/w/cpp/container/unordered_map/insert

erase()似乎保留了除擦除之外的所有迭代器和引用:

http://en.cppreference.com/w/cpp/container/unordered_map/erase

但是,最后一页和标准表明erase()最差执行时间为O(size)。什么操作可以花费线性时间来完成,而不是以使迭代器无效的方式修改容器?

这篇文章表明在擦除过程中迭代器无效: http://kera.name/articles/2011/06/iterator-invalidation-rules-c0x/

我还在某处读到,未来的提案将允许在erase()上进行重新审核。这是真的吗?

如果确实发生了重复,那么旧的迭代和擦除算法是错的吗?

1 个答案:

答案 0 :(得分:7)

如果你有一个非常糟糕的哈希或病态数据,所有元素都可以在一个桶中结束,使其成为O(n)遍历来定位/删除元素。

使用(单个)链接列表为we can see that its iterator type is only required to fulfil the ForwardIterator concept实现std::unordered_map是完全合法的。这样就可以进行线性遍历,即使在传递迭代器时也可以删除存储桶中的元素。

这是可能花费O(n)时间而不是重复的操作。