我想實現類似於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