雜湊桶結構:乙個陣列,每個元素都是乙個單鏈表結點(開雜湊)(閉雜湊只用陣列)
map:用仿函式和雜湊函式來封裝雜湊桶。仿函式是為了計算出元素的值(為什麼要仿函式計算:後序可以封裝set,所以無論是map還是set,存的值都是k-v結構,set存了k-k,也就是兩個一樣的值),雜湊函式用了模板特化,為了能夠更方便的計算出string型別的值的雜湊位置。
原始碼:
雜湊結點
//雜湊結點:實質是乙個單鏈表
template
<
class
v>
struct hashnode
};
雜湊迭代器
//前置宣告
template
<
classk,
classv,
class
keyofvalue
,class
hashfun
>
class
hashbucket
;//迭代器
//k、v是為了相容set和map
//keyofvalue是個仿函式,讓set和map封裝,然後通過仿函式求出set和map裡存的值
//hashfun是雜湊函式,是為了區別計算string的值和普通數字的值,從而計算存放位置
template
<
classk,
classv,
class
keyofvalue
,class
hashfun
>
struct ha****erator
v&operator*(
) v*
operator
->()
bool
operator!=(
const self& it)
self&
operator++(
)else
//否則就由陣列往後找,直到找到陣列有值的位置
}//如果走到最後還沒有找到,就是沒有了,就是end()
if(index == table_size)
}return
*this;}
};
雜湊桶
template
<
classk,
classv,
class
keyofvalue
,class
hashfun
>
class
hashbucket
}return
iterator
(nullptr
,this);
} iterator end()
hashbucket()
:_size(0
) pairbool
>
insert
(const v& data)
cur = cur-
>_next;
}//建立新節點
cur =
newnode
(data)
;//讓新節點指向這個鍊錶的頭,頭插
cur-
>_next = _table[index]
;//更新陣列的元素
_table[index]
= cur;
++_size;
return
make_pair
(iterator
(cur,
this),
true);
}void
chekckcapacity()
keyofvalue kov;
hashfun hf;
vector
new_table
(_size *2)
;for
(int i =
0; i < _table.
size()
;++i)
_table[i]
=nullptr;}
_table.
swap
(new_table);}
};
雜湊函式
//為了得到普通數字的數值
template
<
class
k>
struct hashfunction};
//這裡是模板特化,編譯器會先去找有特化的仿函式,這裡是為了計算string的值,得到string需要存放的位置
template
<
>
struct hashfunction
return hash;}}
;
map
//模擬unordered_map
template
<
classk,
classv,
class
hashfun
= hashfunction>
class
myunorderedmap};
private
://底層實際就是通過雜湊函式和仿函式來封裝了雜湊桶
hashbucket
, mapkeyofvalue, hashfun> _hb;
public
:typedef
typename hashbucket
, mapkeyofvalue, hashfun>
::iterator iterator;
pairbool
>
insert
(const pair
& data)
iterator begin()
iterator end()
v&operator
(const k& key)
};
雜湊錶開雜湊雜湊桶實現
開雜湊法對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個桶中的元素通過乙個單鏈表鏈結起來,各鍊錶的頭結點組成 乙個向量,因此,向量的元素個數與可能的桶數一致。include using namespace std namespace openhas...
js模擬實現雜湊表
在演算法中,尤其是有關陣列的演算法中,雜湊表的使用可以很好的解決問題,所以這篇文章會記錄一些有關js實現雜湊表並給出解決實際問題的例子。說明 這篇部落格所寫並不是真正意義的雜湊表,只是與雜湊表的使用有相似之處。屬性的列舉 var person for var prop in person 輸出 即對...
資料結構 雜湊表及其模擬實現
直接定址法 hashfunc date a date b a,b為常數 從雜湊衝突的位置,找下乙個空餘位置插入元素。尋找方式有兩種,線性探測和二次探測。直接向後 1查詢。h i h0 i 2 或者h i h0 i 2 de需要的原因,此位置不可以插入元素,也不可設定為em 查詢時遇em就停止了,可能...