对于std :: map和std :: tr1 :: unordered_map,我从标准中看到:
References to elements in the unordered_map container remain valid in
all cases,even after a rehash.
他们怎么做(实施)?他们是否将所有条目维护为一种链接列表,然后哈希表只存储指向元素的指针?
解决方法
是的,链接列表涉及,尽管不太符合你的建议.
2011年标准说(23.2.5第8段),“无序关联容器的元素被组织成桶,具有相同散列码的密钥出现在同一个桶中.
在每个桶中,元素是链表(每个桶的单独列表,而不是整个容器的一个大列表).当容器被重新堆叠时,元素将被分配给新的桶,但是每个元素的指针保持有效.每个新的存储桶中的链表从指向该存储桶中的现有元素的指针组合起来.
迭代器无效,因为迭代器需要保持指向元素和其桶的指针(所以它可以从一个桶的最后一个元素到下一个的第一个元素).元素指针保持有效,所以现有的指针和对元素的引用仍然有效,但是桶指针被rehash无效,所以迭代器是不可用的.
(这也是为什么无序容器仅支持前向迭代器,而不是由有序关联容器支持的双向迭代器,每个桶的元素都是单链表,所以您不能向后退.)