c++实现hashmap
时间: 2023-09-02 20:15:52 浏览: 102
C++中可以使用STL中的unordered_map来实现hashmap,也可以手动实现hashmap。
以下是一个简单的手动实现hashmap的示例代码:
```c++
#include <iostream>
#include <vector>
#include <list>
using namespace std;
class HashMap {
private:
vector<list<pair<int, int>>> table; // 存储桶
int capacity; // hashmap容量
int size; // hashmap当前大小
// 获取哈希码
int hash(int key) {
return key % capacity;
}
public:
HashMap(int capacity) {
this->capacity = capacity;
this->size = 0;
table.resize(capacity);
}
// 插入键值对
void put(int key, int value) {
int index = hash(key);
auto &bucket = table[index]; // 获取对应桶
for (auto &node : bucket) { // 查找是否已存在key
if (node.first == key) {
node.second = value; // 更新value
return;
}
}
bucket.emplace_back(key, value); // 插入新节点
size++; // 更新大小
}
// 获取key对应的value
int get(int key) {
int index = hash(key);
auto &bucket = table[index]; // 获取对应桶
for (auto &node : bucket) { // 查找是否存在key
if (node.first == key) {
return node.second; // 返回对应value
}
}
return -1; // 未找到对应key
}
// 删除key对应的节点
void remove(int key) {
int index = hash(key);
auto &bucket = table[index]; // 获取对应桶
for (auto iter = bucket.begin(); iter != bucket.end(); iter++) { // 查找是否存在key
if (iter->first == key) {
bucket.erase(iter); // 移除节点
size--; // 更新大小
return;
}
}
}
// 获取hashmap当前大小
int getSize() {
return size;
}
};
int main() {
HashMap hashMap(10);
hashMap.put(1, 10);
hashMap.put(2, 20);
hashMap.put(11, 110);
hashMap.put(21, 210);
cout << hashMap.get(1) << endl; // 10
cout << hashMap.get(11) << endl; // 110
cout << hashMap.get(3) << endl; // -1
hashMap.remove(2);
cout << hashMap.getSize() << endl; // 3
return 0;
}
```
在该示例代码中,使用vector来存储桶,每个桶是一个链表,存储键值对。在插入、获取、删除操作时,先根据key的哈希值计算出对应的桶,再在桶中查找是否存在对应的键值对。如果存在,则进行更新或移除操作;如果不存在,则进行插入操作。
阅读全文