無序關聯容器的底層是乙個鏈式雜湊表,包括下列四種:
無序關聯容器
特點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等記憶體分配演算法找到合適大小的空閒記憶體塊。如果該空閒記憶體塊過大,還需要切割成已分配的部分和較小的空閒塊。然後...