在完成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()
上进行重新审核。这是真的吗?
如果确实发生了重复,那么旧的迭代和擦除算法是错的吗?
答案 0 :(得分:7)
如果你有一个非常糟糕的哈希或病态数据,所有元素都可以在一个桶中结束,使其成为O(n)遍历来定位/删除元素。
使用(单个)链接列表为we can see that its iterator type is only required to fulfil the ForwardIterator concept实现std::unordered_map
是完全合法的。这样就可以进行线性遍历,即使在传递迭代器时也可以删除存储桶中的元素。
这是可能花费O(n)时间而不是重复的操作。