模拟实现unordered_set和unordered_map

文章介绍了如何改造哈希表结构,包括使用模板参数列表来适应不同的容器类型,如unordered_map和unordered_set,以及定义KeyOfValue以处理不同类型的键值对。此外,文章还详细阐述了添加迭代器操作的过程,特别是++操作的实现,以便于遍历哈希桶中的元素。同时,提供了通过key获取value的方法,包括查找、插入和删除操作。
摘要由CSDN通过智能技术生成

改造哈希表结构

1. 模板参数列表的改造

// K:关键码类型
// V: 不同容器V的类型不同,如果是unordered_map,V代表一个键值对,如果是
unordered_set,V 为 K
// KeyOfValue: 因为V的类型不同,通过value取key的方式就不同,详细见
unordered_map/set的实现
// Hash: 哈希函数仿函数对象类型,哈希函数使用除留余数法,需要将Key转换为整形数字才能取模
template<class K, class V, class KeyOfValue, class HF = DefHashF<T> >
class HashBucket;

2. 增加迭代器操作

// 为了实现简单,在哈希桶的迭代器类中需要用到hashBucket本身,
	template<class K, class V, class KeyOfValue, class HF>
	class HashBucket;
	// 注意:因为哈希桶在底层是单链表结构,所以哈希桶的迭代器不需要--操作
	template <class K, class V, class KeyOfValue, class HF>
	struct HBIterator
	{
		typedef HashBucket<K, V, KeyOfValue, HF> HashBucket;
		typedef HashBucketNode<V>* PNode;
		typedef HBIterator<K, V, KeyOfValue, HF> Self;
		HBIterator(PNode pNode = nullptr, HashBucket* pHt = nullptr);
		Self& operator++()
		{
			// 当前迭代器所指节点后还有节点时直接取其下一个节点
			if (_pNode->_pNext)
				_pNode = _pNode->_pNext;
			else
			{
				// 找下一个不空的桶,返回该桶中第一个节点
				size_t bucketNo = _pHt->HashFunc(KeyOfValue()(_pNode -
> _data)) + 1;
				for (; bucketNo < _pHt->BucketCount(); ++bucketNo)
				{
					if (_pNode = _pHt->_ht[bucketNo])
						break;
				}
			}
			return *this;
		}
		Self operator++(int);
		V& operator*();
		V* operator->();
		bool operator==(const Self& it) const;
		bool operator!=(const Self& it) const;
		PNode _pNode;       // 当前迭代器关联的节点
		HashBucket* _pHt;     // 哈希桶--主要是为了找下一个空桶时候方便
	};

 3. 增加通过key获取value操作

template<class K, class V, class KeyOfValue, class HF = DefHashF<T> >
	class HashBucket
	{
		friend HBIterator<K, V, KeyOfValue, HF>;
		// ......
	public:
		typedef HBIterator<K, V, KeyOfValue, HF> Iterator;
		//
		  // ...
		// 迭代器
		Iterator Begin()
		{
			size_t bucketNo = 0;
			for (; bucketNo < _ht.capacity(); ++bucketNo)
			{
				if (_ht[bucketNo])
					break;
			}
			if (bucketNo < _ht.capacity())
				return Iterator(_ht[bucketNo], this);
			else
				return Iterator(nullptr, this);
		}
		Iterator End() { return Iterator(nullptr, this); }
		Iterator Find(const K& key);
		Iterator Insert(const V& data);
		Iterator Erase(const K& key);

		// 为key的元素在桶中的个数
		size_t Count(const K& key)
		{
			if (Find(key) != End())
				return 1;

			return 0;
		}

		size_t BucketCount()const { return _ht.capacity(); }
		size_t BucketSize(size_t bucketNo)
		{
			size_t count = 0;
			PNode pCur = _ht[bucketNo];
			while (pCur)
			{
				count++;
				pCur = pCur->_pNext;
			}

			return count;
		}

		// ......
	};

unordered_map&unordered_set/哈希表封装unordered_xxx系列 · 杰编程/CPlusPlus - 码云 - 开源中国 (gitee.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰深入学习计算机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值