概述: 无聊的时候学一下。
完整代码:
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
template<typename K, typename V>
class HashMap {
public:
HashMap(size_t capacity = 10) : capacity_(capacity), size_(0) {
table_.resize(capacity_);
}
void put(const K& key, const V& value) {
size_t index = hash(key) % capacity_;
for (auto& pair : table_[index]) {
if (pair.first == key) {
pair.second = value;
return;
}
}
table_[index].emplace_back(key, value);
++size_;
}
V get(const K& key) {
size_t index = hash(key) % capacity_;
for (auto& pair : table_[index]) {
if (pair.first == key) {
return pair.second;
}
}
throw std::runtime_error("Key not found");
}
bool remove(const K& key) {
size_t index = hash(key) % capacity_;
for (auto it = table_[index].begin(); it != table_[index].end(); ++it) {
if (it->first == key) {
table_[index].erase(it);
--size_;
return true;
}
}
return false;
}
size_t size() const {
return size_;
}
private:
size_t hash(const K& key) const {
return std::hash<K>{}(key);
}
size_t capacity_;
size_t size_;
std::vector<std::list<std::pair<K, V>>> table_;
};
int main() {
HashMap<std::string, int> map;
map.put("one", 1);
map.put("two", 2);
map.put("three", 3);
std::cout << "Size: " << map.size() << std::endl;
std::cout << "Value of 'one': " << map.get("one") << std::endl;
std::cout << "Value of 'two': " << map.get("two") << std::endl;
std::cout << "Value of 'three': " << map.get("three") << std::endl;
map.remove("two");
std::cout << "Size after removing 'two': " << map.size() << std::endl;
return 0;
}
这段代码使用单独的链实现了一个简单的哈希映射来解决冲突。让我们来分析一下主要组成部分:
template<typename K, typename V>
是C++中模板的声明方式,表示这是一个模板函数或模板类。其中,K
和V
是类型参数,可以在实例化模板时替换为具体的类型。
而
HashMap map; 就是将k化成string,V化成int类型
HashMap类:这是一个表示散列映射的模板化类。它有put(key, value)方法来添加键值对,get(key)方法来检索与键相关的值,remove(key)方法来删除键值对,size()方法来获取哈希映射的当前大小。
HashMap(size_t capacity = 10) : capacity_(capacity), size_(0) { table_.resize(capacity_); }
这是C++中HashMap类的构造函数。它接受一个名为capacity
的参数,默认值为10。在构造函数内部,它将成员变量capacity_
设置为传入的capacity
值,将size_
设置为0,并调用table_.resize(capacity_)
来调整哈希表的大小。这个构造函数的作用是初始化一个具有指定容量的空HashMap对象。
私有成员:
capacity_:哈希表的初始容量。
size_:表示当前存储在哈希映射中的元素数量。
表_:表示哈希表本身,实现为链表的向量。vector的每个元素都是键值对的链表(std::list)。
公共方法:
put(const K& key, const V& value):在哈希映射中插入一个键值对。它使用散列函数计算索引,然后遍历该索引处的链表,如果键已经存在,则更新该值,或者添加新的键值对。
get(const K& key):检索与给定键相关联的值。它使用散列函数计算索引,并在该索引处的链表中搜索键。如果找到,它返回相应的值;否则,它将抛出运行时错误。
remove(const K& key):删除与给定键相关联的键值对。它使用散列函数计算索引,并在该索引处的链表中搜索键。如果找到,则删除键值对并减小大小;否则,返回false。
size():返回当前哈希映射的大小。
Private Method:
hash(const K& key):该方法使用std::hash函数计算给定键的哈希值。