C 實現乙個簡單的unordered map

2021-10-03 14:48:49 字數 2748 閱讀 5813

無序關聯容器的底層是乙個鏈式雜湊表,包括下列四種:

無序關聯容器

特點unordered_set

無序集合,只儲存key且不允許重複

unordered_multiset

無序多重集合,只儲存key且允許重複

unordered_map

無序對映表,儲存key-value且不允許重複

unordered_multimap

無序多重對映表,儲存key-value且允許重複

本程式實現了乙個具有基礎功能的unordered_map

// key-value型別

template

<

typename k,

typename v>

struct pair

k first;

v second;};

//鏈式雜湊表

template

<

typename k,

typename v>

class

hashmap

/** * 插入key-value對,如果插入的key存在,則用新的value將舊的value替換掉

* 在unordered_map中insert的返回型別為pair,但是由於尚未實現迭代器,故返回值型別為void

*/void

insert

(const pair

&pair)

// idx就是桶的下標

int idx = pair.first % mhashmap.

size()

; list>

&mylist = mhashmap[idx];if

(mylist.

empty()

)else}}

mylist.

push_back

(pair);}

/** * 傳入key,刪除key-value對

*/void

erase

(const k &key)

return;}

}}}/**

* 傳入key,返回包含key的key-value對的迭代器pair

* 如果key不存在,返回nullptr

*/pair

*find

(const k &key)}}

return

nullptr;}

/** * operator的功能:增加乙個[key, v()],然後把v()返回進行賦值操作、覆蓋舊值、查詢

* * 需要注意的是,map[key]當key不存在時會自動增加[key, v()],所以不建議使用operator查詢,只做增加或者覆蓋值使用

*/v&operator

(const k &key)

else}}

// 插入時呼叫insert方法,這樣新插入元素就會適時擴容雜湊表

insert()

;// 把mylist的尾結點的second返回(insert為尾插)

return mylist.

back()

.second;

}private

: vector>

> mhashmap;

// 鏈式雜湊表結構

double mloadfactor;

// 載入因子 0.75

int musebucketnum;

// 記錄已經使用的桶的個數

/** * 判斷是否為素數

* 素數的特性:恆等於 6x-1 或者 6x+1,其中 x 是大於等於1的自然數

* 由素數的特性可知:迴圈的步長可以設為 6,每次只判斷 6 前後的兩個數即可

*/bool

isprime

(int num)

int sq =

(int

)sqrt

(num)

;for

(int i =

5; i <= sq; i +=6

)}return

true;}

// 雜湊表擴容函式

void

expand()

mhashmap.

resize

(prime)

; musebucketnum =0;

// 遍歷oldhashmap裡面每乙個不空的桶,把裡面的list結點splice摘下來,放入新的雜湊表mhashmap中

for(list>

&mylist : oldhashmap)

newlist.

splice

(newlist.

begin()

, mylist, mylist.

begin()

);}}

}};// 測試**

intmain()

);map.

insert()

; map.

insert()

; map.

insert()

; map.

insert()

; cout << map[

1030

]<< endl;

pair<

int, string>

*it = map.

find

(1010);

if(it ==

nullptr

)else

return0;

}

乙個簡單位的C 類實現

這個例子的編譯環境是vc 6.0,所以每個cpp檔案都要帶頭檔案為 include stdafx.h 這個例子共用到3個檔案,乙個標頭檔案,乙個原始檔,乙個main檔案。如下所示 test.h ifndef fraction h define fraction h include using nam...

c 實現乙個簡單的迴圈佇列

實現乙個迴圈佇列 佇列的特點就是先進先出,尾插頭出。涉及到迴圈,無論是陣列還是鍊錶,重點在於取餘!防止溢位。例如陣列大小為5,當隊尾為4時,且 隊頭!隊尾 再入隊後,隊尾應改變為0,需用取餘。include using namespace std class queue 析構函式 queue 拷貝構...

C 實現乙個簡單記憶體池

在使用記憶體池進行記憶體管理之前,通常使用new malloc或者delete free來申請或者釋放記憶體。在這個過程中,系統要首先查詢內部維護的記憶體空閒塊表,並且需要根據比如lru等記憶體分配演算法找到合適大小的空閒記憶體塊。如果該空閒記憶體塊過大,還需要切割成已分配的部分和較小的空閒塊。然後...