为什么允许std :: unordered_map :: rehash使迭代器无效?

问题描述

Visual Studio(2015)的实现不会使任何迭代器无效({rehash()对内部std::list进行重新排序,使所有迭代器保持有效)。

是否存在其他使迭代器无效的实现(即使具有相同的复杂性也可以获得更好的性能)?

std::unordered_map::rehash()上使迭代器无效有时会限制开发人员(例如,我试图仅使用std::unordered_map实现LRU缓存:节点的值具有容器的迭代器)。但是使迭代器无效的可能性是否可以更好地实现std::unordered_map::rehash()

解决方法

感谢@DanielLangr进行以上讨论,

我认为,此要求附带std::unordered_map::[const_]iterator定义为LegacyForwardIterator(而不是LegacyBidirectionalIterator)。并且如果不使std::forward_list中的迭代器无效(可能是{{1}除外),就不可能使用内部std::list或类似的方法(而不是VS'rehash())来实现具有更好的内存占用的实现。 / p>

  • 这种更好的内存占用实现可能会在各处添加一些[简单]汇编指令(也可能在其他地方保存一些指令),或者可能具有更大的end(),但是定义{{ 1}}的要求,并将所有这些注意事项留给实施者。