EASTL和SGI哈希表的实现

EASTL and SGI Hashtable implemenation

本文关键字:实现 哈希表 SGI EASTL      更新时间:2023-10-16

在这两种实现中,容器都存储了node_type的原始数组,它本质上是一个存储类型T的简单链表。

// From SGI
template <class _Val>
struct _Hashtable_node
{
  _Hashtable_node* _M_next;
  _Val _M_val;
}; 

出于教育原因,我正在实现我自己的版本,我想知道他们为什么不使用std::list<>容器来放置水桶?为什么要编写std::list<>中已经存在的代码?

我遇到的一个原因可能是std::list<>是双重链接的,所以浪费了空间。但是如果使用一个单独的链表呢?为什么不给bucket_type一个模板参数,这样它就可以更改了?

在这些实现中不为bucket使用列表类[template]的原因是它们没有单链列表,而std::list<T>是双链接的:不必要的返回指针在运行时和大小方面的额外成本将被认为是不好的。C++2011现在有了std::forward_list<T>,这几乎是出于在散列容器中使用它的愿望。这可能会引发一个问题:为什么他们当时没有添加一个单链表?这个问题的答案也很简单:一个单独链接的列表不能满足标准的容器要求,只能留待以后做出适当的选择。