【c++学习】unordered_map与unordered_set模拟实现

本文介绍了如何模拟实现unordered_map和unordered_set的迭代器,包括end()和begin()函数,以及运算符++的重载,强调了基于哈希桶的存储结构和泛型编程在其中的作用。
摘要由CSDN通过智能技术生成

前言:

由于上一章我们已经模拟实现了哈希桶,这一章主要针对于这俩的迭代器进行模拟封装。

unordered_map与unordered_set

unordered_map与unordered_set的底层实现是根据哈希构建的,所以他们俩存储的数据是无序的,我们可以利用上一章的哈希桶的实现来进行封装模拟

对于两个类用同于结构封装,必不可少的的是泛型。
桶节点:

template<class T>
struct HashNode
{
	HashNode<T>* _next;
	T _data;
	HashNode(const T& data)
		:_next(nullptr)
		,_data(data)
	{}
};

迭代器

如下图哈希桶的具体存储是这样的,所以对于迭代器的一些运算符重载需要根据结构实现。
在这里插入图片描述

end()

iterator end()
{
	return iterator(nullptr, this);
}

begin()

在图中的我门需要遍历全表找到表中存在的第一个值,返回此空间的地址。

iterator begin()
{
	for (size_t i = 0; i < length; i++)
	{
		if (_tables[i])
		{
			return iterator(_tables[i], this);
		}
	}
	return end();
}

运算符++

上图为例,指向一个空间时,++则是先遍历这个位置的桶,如果桶遍历完则遍历下一个有值的表位置。

Self& operator++()
{
	if (_node->_next)
	{
		_node = _node->_next;
	}
	else
	{
		KeyOfT kt;
		Hash hs;
		size_t hashi = hs(kt(_node->_data)) % _ht->_table.size();
		hashi++;
		while (hashi < _ht->_tables.size())
		{
			if (_ht->_tables[i])
			{
				_node = _ht->_tables[i];
				break;
			}
			hashi++;
		}
		if (hashi == _ht->_tables.size())
		{
			_node = nullptr;
		}
	}
	return *this;
}

unordered_map结构

template<class K, class V, class Hash = HashFunc<K>>
class unordered_map
{
	struct MapKeyOfT
	{
		const K& operator()(const pair<K, V>& kv)
		{
			return kv.first;
		}
	};

public:
	typedef typename HashTable<K, pair<const K, V>, MapKeyOfT, Hash>::iterator iterator;

	iterator begin()
	{
		return _ht.begin();
	}

	iterator end()
	{
		return _ht.end();
	}

	bool insert(const pair<K, V>& kv)
	{
		return _ht.Insert(kv);
	}
private:
	HashTable<K, pair<const K, V>, MapKeyOfT, Hash> _ht;
};

unordered_set结构

template<class K, class Hash = HashFunc<K>>
class unordered_set
{
	struct SetKeyOfT
	{
		const K& operator()(const K& key)
		{
			return key;
		}
	};
public:
	typedef typename HashTable<K, const K, SetKeyOfT, Hash>::iterator iterator;

	iterator begin()
	{
		return _ht.begin();
	}

	iterator end()
	{
		return _ht.end();
	}

	bool insert(const K& key)
	{
		return _ht.Insert(key);
	}

private:
	HashTable<K, const K, SetKeyOfT, Hash> _ht;
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值