您好,登錄后才能下訂單哦!
設計一個自定義的C++哈希表需要考慮以下幾個關鍵點:
下面是一個簡單的自定義C++哈希表設計示例,使用了鏈地址法來解決沖突,并且支持動態擴容:
#include <iostream>
#include <list>
#include <vector>
#include <algorithm>
template <typename Key, typename Value>
class HashTable {
private:
struct Entry {
Key key;
Value value;
bool occupied;
Entry() : occupied(false) {}
};
std::vector<std::list<Entry>> table;
size_t size;
size_t capacity;
float loadFactorThreshold;
size_t hash(const Key& key) const {
return std::hash<Key>{}(key) % capacity;
}
void rehash(size_t newCapacity) {
std::vector<std::list<Entry>> newTable(newCapacity);
for (const auto& bucket : table) {
for (const auto& entry : bucket) {
if (entry.occupied) {
size_t newIndex = std::hash<Key>{}(entry.key) % newCapacity;
newTable[newIndex].push_back(entry);
}
}
}
table = std::move(newTable);
capacity = newCapacity;
}
public:
HashTable(size_t initialCapacity = 10, float loadFactorThreshold = 0.75)
: size(0), capacity(initialCapacity), loadFactorThreshold(loadFactorThreshold) {
table.resize(capacity);
}
void insert(const Key& key, const Value& value) {
if (static_cast<float>(size) / capacity >= loadFactorThreshold) {
rehash(capacity * 2);
}
size_t index = hash(key);
for (auto& entry : table[index]) {
if (entry.key == key) {
entry.value = value;
return;
}
}
table[index].push_back({key, value, true});
++size;
}
bool remove(const Key& key) {
size_t index = hash(key);
for (auto it = table[index].begin(); it != table[index].end(); ++it) {
if (it->key == key) {
table[index].erase(it);
--size;
return true;
}
}
return false;
}
bool find(const Key& key, Value& value) const {
size_t index = hash(key);
for (const auto& entry : table[index]) {
if (entry.key == key) {
value = entry.value;
return true;
}
}
return false;
}
size_t getSize() const {
return size;
}
size_t getCapacity() const {
return capacity;
}
};
int main() {
HashTable<int, std::string> ht;
ht.insert(1, "one");
ht.insert(11, "eleven");
ht.insert(21, "twenty-one");
std::string value;
if (ht.find(11, value)) {
std::cout << "Found: " << value << std::endl;
} else {
std::cout << "Not found" << std::endl;
}
ht.remove(11);
if (ht.find(11, value)) {
std::cout << "Found: " << value << std::endl;
} else {
std::cout << "Not found" << std::endl;
}
return 0;
}
std::hash<Key>
來生成鍵的哈希值。std::list<Entry>
。loadFactorThreshold
時,將容量加倍。std::vector
來管理桶,自動處理內存分配和釋放。這個示例是一個基礎的哈希表實現,可以根據具體需求進行擴展和優化。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。