用C++實現一個哈希表(插入,刪除,查找)

#include<iostream>
#include<string>

using namespace std;

enum status
{
	EXIST,
	DELETE,
	EMPTY,
};
template <class K>
struct hashfunc //構造仿函數
{
	size_t operator()(const K & key)
	{
		return key;
	}
};
struct hashfuncstring      <span style="font-family: Arial, Helvetica, sans-serif;">//構造仿函數(string類型)</span><pre name="code" class="cpp"><span style="font-family: Arial, Helvetica, sans-serif;">{</span>
size_t operator()(const string & key){size_t size = 0;size_t seed = 131;for (size_t i = 0; i < key.size(); i++){size = size*seed + key[i];}return size;}};template <class K,class HashFuncer=hashfunc<K>>class HashTable{public:HashTable(size_t size=10):_tables(new K[size]), _status(new status[size]), _size(0), _capacity(size){for (size_t i = 0; i < size; i++){_status[i] = EMPTY;}}~HashTable(){if (_status){delete[]_status;delete[]_tables;}}void Insert(K key)//插入{_CheckCapacity();size_t index = HashFunc(key);while (_status[index] == EXIST){index++;index = index%_capacity;}_tables[index] = key;_status[index] = EXIST;_size++;}K Find(const K & key) //查找{size_t index = HashFunc(key);while (_status[index] != EMPTY){if (_status[index] == EXIST){if (_tables[index] == key){return index;}}index++;index = index%_capacity;}return -1;}bool Remove(const K & key) //刪除{size_t ret = Find(key);if (ret >= 0){_status[ret] = DELETE;return true;}return false;}void Print(){for (size_t i = 0; i < _capacity; i++){cout << _tables[i] << endl;}}protected:int HashFunc(K & key) //計算index{return HashFuncer()(key)%_capacity;}void _CheckCapacity() //容量檢查(負載因子){if (_size * 10 >= _capacity * 7){_capacity *= 2;HashTable<K,HashFuncer> tmp(_capacity);for (size_t i = 0; i < _capacity; i++){if (_status[i] == EXIST){tmp.Insert(_tables[i]);}}swap(tmp._tables, _tables);swap(tmp._status, _status);swap(tmp._size, _size);swap(tmp._capacity, _capacity);}}protected:K *_tables;status * _status;size_t _size;size_t _capacity;};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章