unordered_map迭代器/引用失效是否允许布谷鸟,跳房子和知更鸟引号散列?

时间:2016-05-25 04:56:15

标签: c++ hashtable language-lawyer c++14 unordered-map

我试图弄清楚是否有可能使用Cuckoo Hashing,Hopscotch Hashing等技术构建现代C ++ std::unordered_map的符合性,高效的实现方式,和Robin Hood Hashing可以实现非常紧凑的工作台,高负载系数,并保持高性能。这些技术的特殊之处在于它们涉及潜在地移动一些元素以便为其他元素腾出空间,而不仅仅是链接,或探测直到找到一个开放的槽(如线性或二次探测)或。

来自insert http://www.cplusplus.com/reference/unordered_map/unordered_map/insert/

  
      
  1. 迭代器有效性   在大多数情况下,容器中的所有迭代器在插入后仍然有效。唯一的例外是当集装箱的增长迫使重新开始时。在这种情况下,容器中的所有迭代器都将失效。

  2.   
  3. 如果插入操作后的新容器大小超过其容量阈值(计算为容器的bucket_count乘以其max_load_factor),则强制重新散列。

  4.   
  5. 对unordered_map容器中元素的引用在所有情况下都保持有效,即使在重新散列后也是如此。

  6.   

erase http://www.cplusplus.com/reference/unordered_map/unordered_map/erase/

  
      
  1. 只有迭代器和对删除的元素的引用无效。

  2.   
  3. 其余的不受影响。

  4.   
  5. [仅限c ++ 14]保留未被操作删除的元素的相对迭代顺序。

  6.   

其他引用通常在两个操作中都保持有效的要求似乎需要一个涉及驱逐的探测方案,以便在表结构上工作,该表结构分配与数组分离的节点并指向它们。也许实现可以保留一个单独的元素数组,表中的条目本身可以索引,以避免额外的动态分配,但仍然增加了额外的间接。有没有更有效的方法来满足这一要求?

即使在重新散列之后,元素引用仍然在insert之间保持有效的要求似乎暗示即使对于链接或非移动开放寻址设计,也需要动态节点分配或类似上述间接数组的内容。是吗?

一般情况下,标准强制间接或{6>中的标准强制执行是否要求unordered_map

0 个答案:

没有答案