要在C++中實(shí)現(xiàn)自定義HashMap,可以按照以下步驟進(jìn)行:
創(chuàng)建一個(gè)哈希表類,定義哈希表的數(shù)據(jù)結(jié)構(gòu)和相關(guān)方法。哈希表類通常包含一個(gè)數(shù)組作為存儲(chǔ)桶,每個(gè)存儲(chǔ)桶可以存儲(chǔ)多個(gè)鍵值對(duì)。還需要定義哈希函數(shù)來計(jì)算鍵的哈希值,并且定義解決哈希沖突的方法(如鏈地址法或開放尋址法)。
實(shí)現(xiàn)哈希函數(shù)。哈希函數(shù)負(fù)責(zé)將鍵映射到存儲(chǔ)桶的索引,通常使用除留余數(shù)法或乘法哈希等方法來計(jì)算哈希值。
實(shí)現(xiàn)存儲(chǔ)桶結(jié)構(gòu)。存儲(chǔ)桶通常包含一個(gè)鏈表或者數(shù)組,用于存儲(chǔ)鍵值對(duì)。在處理哈希沖突時(shí),可以將新的鍵值對(duì)插入到存儲(chǔ)桶中。
實(shí)現(xiàn)插入、查找和刪除操作。在哈希表類中定義插入、查找和刪除方法,以便用戶可以對(duì)哈希表進(jìn)行操作。
測(cè)試哈希表。編寫測(cè)試用例對(duì)實(shí)現(xiàn)的哈希表進(jìn)行測(cè)試,確保其功能正確并且性能良好。
下面是一個(gè)簡(jiǎn)單的示例代碼,演示了如何實(shí)現(xiàn)一個(gè)自定義的哈希表:
#include <iostream>
#include <vector>
#include <list>
class HashMap {
private:
static const int TABLE_SIZE = 10;
std::vector<std::list<std::pair<int, int>>> table;
int hashFunction(int key) {
return key % TABLE_SIZE;
}
public:
HashMap() : table(TABLE_SIZE) {}
void insert(int key, int value) {
int index = hashFunction(key);
table[index].push_back(std::make_pair(key, value));
}
int get(int key) {
int index = hashFunction(key);
for (auto& pair : table[index]) {
if (pair.first == key) {
return pair.second;
}
}
return -1;
}
void remove(int key) {
int index = hashFunction(key);
table[index].remove_if([key](const std::pair<int, int>& pair) { return pair.first == key; });
}
};
int main() {
HashMap map;
map.insert(1, 10);
map.insert(2, 20);
map.insert(11, 30);
std::cout << "Value for key 1: " << map.get(1) << std::endl;
std::cout << "Value for key 2: " << map.get(2) << std::endl;
std::cout << "Value for key 11: " << map.get(11) << std::endl;
map.remove(2);
std::cout << "Value for key 2 after removal: " << map.get(2) << std::endl;
return 0;
}
在這個(gè)示例中,我們定義了一個(gè)HashMap
類,使用一個(gè)std::vector
來存儲(chǔ)存儲(chǔ)桶,每個(gè)存儲(chǔ)桶是一個(gè)std::list
,用于存儲(chǔ)鍵值對(duì)。哈希函數(shù)采用了簡(jiǎn)單的除余法,插入、查找和刪除操作分別對(duì)應(yīng)insert
、get
和remove
方法。通過這個(gè)簡(jiǎn)單的示例,你可以進(jìn)一步擴(kuò)展和優(yōu)化自定義的哈希表類。