目录
HashTable.h:
Test.cpp:
MyUnorderedSet.h:
HashTable.h:
#pragma once
#include<iostream>
#include<vector>
#include<utility>//pair头文件
#include<assert.h>
#include<string>
using namespace std;
namespace CLOSEHASH
{
enum State
{
EMPTY, //空
EXIST, //存在
DELETE //删除
};
template<class T>
struct HashData
{
T _data;
State _state; //代表数据状态
HashData()
:_state(EMPTY)
,_data(0)
{}
};
template<class K, class T, class KeyOfT>
class HashTable
{
typedef HashData<T> HashData;
public:
bool Insert(const T& data)
{
KeyOfT koft;
//1、增容:第一次插入或者负载因子>=0.7就要增容
if (_tables.capacity() == 0 || _num * 10 / _tables.capacity() == 7)
{
//A、增容——传统思路
//vector<HashData> newtables;
//size_t newcapacity = _tables.capacity() == 0 ? 10 : _tables.capacity() * 2;
//newtables.resize(newcapacity);//开空间+自动初始化为0
把旧空间数据拷贝到新空间中
//for (size_t i = 0; i < _tables.capacity(); ++i)
//{
// if (_tables[i]._state == EXIST)
// {
// size_t index = koft(_tables[i]._data) % newtables.capacity();
// while (newtables[index]._state == EXIST)
// {
// index++;
// if (index == newtables.capacity())
// {
// index = 0;//走到尾了就要返回头找位置
// }
// }
// newtables[index] = _tables[i];
// }
//}
//_tables.swap(newtables);
//B、增容——简便思路
HashTable<K, T, KeyOfT> newht;
size_t newcapacity = _tables.capacity() == 0 ? 10 : _tables.capacity() * 2;
newht._tables.resize(newcapacity);
for (size_t i = 0; i < _tables.capacity(); ++i)
{
if (_tables[i]._state == EXIST)
{
newht.Insert(_tables[i]._data);//把原哈希表中每个数据利用Insert都插入到新哈希表中
}
}
_tables.swap(newht._tables);//交换两者的vector
}
//1、线性探测
//size_t index = koft(data) % _tables.capacity();//计算出要映射的位置
//while (_tables[index]._state == EXIST)
//{
// if (koft(_tables[index]._data) == koft(data))
// {
// return false;//如果存在相同的数据
// }
// ++index;
// if (index == _tables.capacity())
// {
// index = 0;
// }
//}
//2、二次探测
size_t start = koft(data) % _tables.capacity();
size_t index = start;
int i = 1;