编写C++代码编写代码在哈希表(除留余数法+拉链法)HashTable2类中添加remove(k)算法用于删除关键字为k的元素。
时间: 2024-12-29 11:31:00 浏览: 8
在C++中,哈希表(通常使用数组或链表作为底层数据结构)通常包含插入、查找和删除操作。下面是一个基本的`HashTable2`类设计,其中包含了`remove`函数,该函数采用除留余数法(也称作取模运算)确定键值在哈希表中的位置,并通过拉链法处理冲突(即多个键值映射到相同的哈希地址):
```cpp
#include <vector>
#include <list>
class HashTable2 {
private:
int size; // 哈希表大小
std::vector<std::list<int>> table; // 使用列表存储每个桶
public:
HashTable2(int capacity) : size(capacity) { }
// 添加元素
void insert(int key) {
int index = hashFunction(key); // 哈希函数
if (table[index].empty()) {
table[index].push_back(key);
} else {
for (int i = 0; i < table[index].size(); ++i) {
if (table[index][i] == key) {
table[index].erase(table[index].begin() + i);
break;
}
}
}
}
// 删除元素
void remove(int key) {
int index = hashFunction(key);
auto it = findElement(index, key);
if (it != table[index].end()) {
table[index].erase(it);
}
}
// 查找元素
bool contains(int key) const {
int index = hashFunction(key);
return !table[index].empty() && table[index].front() == key;
}
private:
int hashFunction(int key) const {
// 这里仅示例取模运算作为哈希函数,实际应用中需要更复杂的哈希算法
return key % size;
}
// 在给定索引内查找元素
std::list<int>::iterator findElement(int index, int target) const {
for (auto it = table[index].begin(); it != table[index].end(); ++it) {
if (*it == target)
return it;
}
return table[index].end();
}
};
// 示例用法
int main() {
HashTable2 ht(10);
ht.insert(5);
ht.insert(15);
ht.remove(5); // 删除key为5的元素
if (ht.contains(5)) {
std::cout << "5 is still in the hash table" << std::endl; // 输出 false
} else {
std::cout << "5 has been successfully removed" << std::endl;
}
return 0;
}
```
阅读全文