C++ stl unordered_map实现,引用有效性

C++ stl unordered_map implementation, reference validity

本文关键字:引用 有效性 实现 map stl unordered C++      更新时间:2023-10-16

对于std::mapstd::tr1::unordered_map,我从标准中看到:

对unordered_map容器中元素的引用在 所有情况,即使在重述之后。

他们是如何做到这一点的(实施方面)?他们是否将所有条目维护为一种链表,然后哈希表仅存储指向元素的指针?

是的,涉及链表,尽管不是你建议的方式。

2011年的标准说(23.2.5第8段),"无序关联容器的元素被组织到桶中。具有相同哈希代码的键将显示在同一存储桶中。

在每个存储桶中,元素位于链表中(每个存储桶的单独列表,而不是整个容器的一个大列表)。重新散列容器时,元素将分配给新存储桶,但指向每个元素的指针仍然有效。每个新存储桶中的链表由指向该存储桶中结束的现有元素的指针组合而成。

迭代器

因重新哈希而失效,因为迭代器需要同时保存指向元素及其存储桶的指针(因此它可以从一个存储桶的最后一个元素步进到下一个存储桶的第一个元素)。元素指针仍然有效,因此对元素的现有指针和引用仍然有效,但存储桶指针因重新哈希而失效,因此迭代器不可用。

(这也是为什么无序容器只支持前向迭代器,而不是有序关联容器支持的双向迭代器的原因。每个存储桶的元素位于单个链表中,因此您无法向后浏览它们。