C++ stl unordered_map实现,引用有效性
C++ stl unordered_map implementation, reference validity
对于std::map
和std::tr1::unordered_map
,我从标准中看到:
对unordered_map容器中元素的引用在 所有情况,即使在重述之后。
他们是如何做到这一点的(实施方面)?他们是否将所有条目维护为一种链表,然后哈希表仅存储指向元素的指针?
是的,涉及链表,尽管不是你建议的方式。
2011年的标准说(23.2.5第8段),"无序关联容器的元素被组织到桶中。具有相同哈希代码的键将显示在同一存储桶中。
在每个存储桶中,元素位于链表中(每个存储桶的单独列表,而不是整个容器的一个大列表)。重新散列容器时,元素将分配给新存储桶,但指向每个元素的指针仍然有效。每个新存储桶中的链表由指向该存储桶中结束的现有元素的指针组合而成。
迭代器因重新哈希而失效,因为迭代器需要同时保存指向元素及其存储桶的指针(因此它可以从一个存储桶的最后一个元素步进到下一个存储桶的第一个元素)。元素指针仍然有效,因此对元素的现有指针和引用仍然有效,但存储桶指针因重新哈希而失效,因此迭代器不可用。
(这也是为什么无序容器只支持前向迭代器,而不是有序关联容器支持的双向迭代器的原因。每个存储桶的元素位于单个链表中,因此您无法向后浏览它们。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- C++ stl unordered_map实现,引用有效性
- QMap/QHash操作符[]返回引用有效性
- 对 boost::smart_ptr 的引用指向对象并检查其有效性