模擬實現雜湊桶,並封裝雜湊桶模擬實現map

2021-10-05 04:12:36 字數 3040 閱讀 7500

雜湊桶結構:乙個陣列,每個元素都是乙個單鏈表結點(開雜湊)(閉雜湊只用陣列)

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就停止了,可能...