C ++ STL unordered_map实现,引用的有效性(C++ stl unordered_

2019-06-26 01:53发布

对于这两种std::mapstd::tr1::unordered_map ,我从标准看:

引用在unordered_map容器中的元素在所有情况下仍然有效,即使是老调重弹了。

他们是如何这样做( 实施明智 )? 他们是否保持所有条目作为一种链接列表,然后哈希表只存储指针的元素?

Answer 1:

是的,链表都参与其中,虽然在方式不太你建议。

2011标准说(23.2.5第8段),“一种无序关联容器中的元素组织成桶。具有相同散列码的键显示在同一个桶”。

在每个桶的元素在链表(每个桶的单独列表,而不是一个大单子整个容器)。 当容器被重新散列,元件将被分配给新的桶,但指针到每个元件仍然有效。 在每一个新的桶中的链表指针从组装在该桶结束现有的元件。

迭代由翻版无效,因为一个迭代需要持有指针指向元素及其桶两者(因此它可以从一个桶的最后一个元素被步进到下一个的第一个元素)。 元素指针仍然有效,所以现有的指针和引用的元件仍然有效,但挖斗指针由无效翻版,因此迭代器是不可用的。

(这也是为什么无序容器只支持前向迭代器,而不是通过有序关联容器支持双向迭代器。每个桶的元素是一个单向链表,所以你无法通过他们向后移动。)



文章来源: C++ stl unordered_map implementation, reference validity