C++泛型编程实现哈希表(闭散列---线性探测)

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++泛型编程实现哈希表(闭散列---线性探测)相关的知识,希望对你有一定的参考价值。

代码如下:

#include <iostream>
#include <vector>
using namespace std;

enum STATE
{
	EXIST,
	DELETE,
	EMPTY
};

template<typename K,typename V>
struct HashNode
{
	pair<K, V> _kv;
	STATE _state = EMPTY;
};

template<typename K,typename V>
class HashTable
{
public:
	typedef HashNode<K, V> Node;

	HashTable(size_t n = 10):_hTable(n),_size(0){}

	bool insert(const pair<K, V> & kv)
	{
		checkCapacity();

		int idx = kv.first % _hTable.size();

		while (_hTable[idx]._state != EMPTY)
		{
			if (_hTable[idx]._state == EXIST && _hTable[idx]._kv.first == kv.first)
			{
				return false;
			}

			++idx;

			if (idx == _hTable.size()) idx = 0;
		}

		_hTable[idx]._kv = kv;
		_hTable[idx]._state = EXIST;
		++_size;
	}

	void checkCapacity()
	{
		if (_hTable.size() == 0 || _size * 10 / _hTable.size() >= 7)
		{
			int newC = _hTable.size() == 0 ? 10 : 2 * _hTable.size();
			HashTable<K, V> newHt(newC);

			for (size_t i = 0; i < _hTable.size(); i++)
			{
				if (_hTable[i]._state == EXIST)
				{
					newHt.insert(_hTable[i]._kv);
				}
			}
			Swap(newHt);
		}
	}

	void Swap(HashTable<K, V> & Ht)
	{
		swap(_hTable, Ht._hTable);
		swap(_size, Ht._size);
	}

	Node * find(const K & key)
	{
		int idx = key % _hTable.size();
		while (_hTable[idx]._state != EMPTY)
		{
			if (_hTable[idx]._state == EXIST && key == _hTable[idx]._kv.first)
			{
				return &_hTable[idx];
			}
			++idx;
			if (idx == _hTable.size()) idx = 0;
		}

		return nullptr;
	}

	bool erase(const K & key)
	{
		Node *node = find(key);
		if (node)
		{
			--_size;
			node->_state = DELETE;
			return true;
		}
		return false;
	}

private:
	vector<Node> _hTable;
	size_t _size;
};

int main()
{
	HashTable<int,int> h;
	h.insert(make_pair(1, 232));
	h.insert(make_pair(3, 2432));
	h.insert(make_pair(11, 56));
	cout<<h.find(3)->_kv.second<<endl;
	cout << h.find(11)->_kv.second << endl;
	return 0;
}

测试结果:
在这里插入图片描述

以上是关于C++泛型编程实现哈希表(闭散列---线性探测)的主要内容,如果未能解决你的问题,请参考以下文章

线性探测-闭散列

C++ 哈希

C++数据结构——哈希表

C++数据结构——哈希表

C++数据结构——哈希表

C++数据结构——哈希表