对于这两种std::map
和std::tr1::unordered_map
,我从标准看:
引用在unordered_map容器中的元素在所有情况下仍然有效,即使是老调重弹了。
他们是如何这样做( 实施明智 )? 他们是否保持所有条目作为一种链接列表,然后哈希表只存储指针的元素?
对于这两种std::map
和std::tr1::unordered_map
,我从标准看:
引用在unordered_map容器中的元素在所有情况下仍然有效,即使是老调重弹了。
他们是如何这样做( 实施明智 )? 他们是否保持所有条目作为一种链接列表,然后哈希表只存储指针的元素?
是的,链表都参与其中,虽然在方式不太你建议。
2011标准说(23.2.5第8段),“一种无序关联容器中的元素组织成桶。具有相同散列码的键显示在同一个桶”。
在每个桶的元素在链表(每个桶的单独列表,而不是一个大单子整个容器)。 当容器被重新散列,元件将被分配给新的桶,但指针到每个元件仍然有效。 在每一个新的桶中的链表指针从组装在该桶结束现有的元件。
迭代由翻版无效,因为一个迭代需要持有指针指向元素及其桶两者(因此它可以从一个桶的最后一个元素被步进到下一个的第一个元素)。 元素指针仍然有效,所以现有的指针和引用的元件仍然有效,但挖斗指针由无效翻版,因此迭代器是不可用的。
(这也是为什么无序容器只支持前向迭代器,而不是通过有序关联容器支持双向迭代器。每个桶的元素是一个单向链表,所以你无法通过他们向后移动。)