前言
今天我們來試著用哈希封裝一下unordered_map和unordered_set這兩個容器
由于主要的哈希的模擬實現都在之前的文章中,所以本文只是對于幾個小問題進行說明
KeyOfT:取出key
因為我們傳的第二個模板參數是T,我們不知道他是key還是pair<K, V>。所以,我們要增加一個模板參數取出data中的key
給出兩種實現:MapKeyOfT和SetKeyOfT
struct MapKeyOfT{const K& operator()(const pair<K, V>& kv){return kv.first;}};
struct SetKeyOfT{const K& operator()(const K& key){return key;}};
Insert:插入
直接調用哈希的Insert就好了(
iterator:迭代器
迭代器的需求:
- 解引用
- 自增
- 不等于
我們要把什么封裝成迭代器呢?
節點的指針?
那我們需要知道:當a桶遍歷完了,怎么找到a+1號桶呢?
給出的解決方案是:迭代器中給兩個成員:節點的指針和哈希桶的指針
using iterator = hash_bucket::HashTable<K, const K, SetKeyOfT, Hash>::iterator;
//hash_bucket 就是哈希桶
解決iterator和HashTable的相互引用
因為iterator和Hash Table中都是用到了對方,所以編譯的時候編譯器在他們的前面找不到(比如,iterator寫在前面,但找不到HashTable:因為編譯的時候是往iterator的前面找,而不是往后面找)
所以我們要在iterator前面先聲明一下:前置聲明
注意:前置聲明要去掉缺省參數。
解決_tables私有成員無法訪問
在operator++()中,我們用到了_tables.size(),但他是私有成員,無法訪問,怎么解決呢?
有兩種方法:
- 寫一個GetTables,取出私有成員
- 寫一個類模板的友元
類模板的友元要加上模板的聲明
operator[]
先Insert,插入無論成功還是失敗都返回指針
總結
本文到這里就結束了,希望對你有幫助~