【发布时间】:2012-07-05 10:53:47
【问题描述】:
对于std::map 和std::tr1::unordered_map,我从标准中看到:
对 unordered_map 容器中元素的引用在 所有情况,即使在重新哈希之后。
他们是如何做到的(实施方面)?他们是否将所有条目维护为一种链表,然后哈希表只存储指向元素的指针?
【问题讨论】:
标签: c++ stl map reference unordered-map
对于std::map 和std::tr1::unordered_map,我从标准中看到:
对 unordered_map 容器中元素的引用在 所有情况,即使在重新哈希之后。
他们是如何做到的(实施方面)?他们是否将所有条目维护为一种链表,然后哈希表只存储指向元素的指针?
【问题讨论】:
标签: c++ stl map reference unordered-map
是的,涉及到链表,但与您建议的方式不完全一样。
2011 年标准说(23.2.5 第 8 段),“无序关联容器的元素被组织成桶。具有相同哈希码的键出现在同一个桶中。”
在每个桶中,元素都在一个链表中(每个桶有一个单独的列表,而不是整个容器的一个大列表)。当容器被重新散列时,元素将被分配给新的桶,但指向每个元素的指针仍然有效。每个新桶中的链表由指向该桶中现有元素的指针组装而成。
迭代器被 rehash 无效,因为迭代器需要保存指向元素及其桶的指针(因此它可以从一个桶的最后一个元素步进到下一个桶的第一个元素)。元素指针仍然有效,因此现有的指针和对元素的引用仍然有效,但桶指针被 rehash 无效,因此迭代器不可用。
(这也是为什么无序容器只支持前向迭代器,而不是有序关联容器支持的双向迭代器。每个桶的元素都在一个单链表中,所以你不能后退。)
【讨论】: