我想实现类似于std的unordered_map
。因此,我查看了Visual C++ 2013中的<unordered_map>
和<xhash>
中的源代码。我发现实现在unordered_map
构造函数中调用_Init
函数。我发现,该函数的定义如下:Visual C++实现std :: unordered_map只有一个std :: list?
void _Init(size_type _Buckets = _Min_buckets)
{ // initialize hash table with _Buckets buckets, leave list alone
_Vec.assign(2 * _Buckets, _Unchecked_end());
_Mask = _Buckets - 1;
_Maxidx = _Buckets;
}
功能_Unchecked_end()
刚刚返回_List.Unchecked_end()
:
_Unchecked_iterator _Unchecked_end()
{ // return iterator for end of mutable sequence
return (_List._Unchecked_end());
}
而且std::unordered_map
的begin()
刚刚返回_List.begin()
...
我认为仅具有一个列表的find()
函数unordered_map
在平均情况下不能满足恒定的复杂度。
那么...... VC++如何实现std::unordered_map
?
对不起,我没有说清楚。在我看来,执行unordered_map
应该是一个带有许多列表的向量(具有不同迭代器的初始值为的不同std::list
s)。但我只找到单个列表(Init与迭代器的一个std::list
)。这才是重点。
“只有一个列表”是什么意思?你抱怨'std :: list'和'std :: unordered_map'具有不同的访问复杂性;你知道他们是不同的数据结构吗? – 2014-10-11 13:50:31
如果你想实现你自己的'unordered_map',首先阅读[一个引用](http://en.cppreference。com/w/cpp/container/unordered_map),了解它的全部内容,理解它背后的概念(散列表和散列表),然后*不要*从高度优化的标准库中读取任何实现。这些标准库不容易被阅读和理解,但是如果你知道哈希表背后的概念,那么你可以轻松地构建自己的实现。 – 2014-10-11 13:51:43
'_Vec'是描绘每个桶的迭代器(放入'_List')的向量。所有的桶都链接在一起成为一个链表,但每个桶都可以在一段时间内被访问。 – 2014-10-11 13:57:21