unordered_map\unordered_set的模拟实现及注意事项

unordered_map

template<class K, class V, class KeyofValue, class HF>
	class unordered_map
	{
		typedef pair<K, V> ValueType;
		typedef HashBucket<K, ValueType, KeyofValue, HF> HT;

		struct KeyofValue
		{
			const K &operator()(const ValueType& data)
			{
				return data.first;
			}
		};

	public:
		typename typedef HT::iterator iterator;//前面加typename的作用就是告诉操作系统typedef后面是一个类型
	public:
		unordered_map() : m_ht()
		{}

		iterator begin()
		{
			return m_ht.begin();
		}
		iterator end()
		{
			return m_ht.end();
		}

		size_t size() const
		{
			return m_ht.m_size();
		}
		V& operator[](const K& key)//取[]后得到一个值,对于unordered_map,这个值是pair,就是V
		{
			iterator i = m_ht.insert(ValueType(key, V()));
			return (*i).second;
		}

		iterator find(const T& val)
		{
			return m_ht.find();
		}
		iterator insert(const ValurType & val)
		{
			return m_ht.insert();
		}
		iterator erase(const ValurType & val)
		{
			return m_ht.erase();
		}
	private:
		HT m_ht;
	};

unordered_set

template<class K, class V, class KeyofValue, class HF>
	class unordered_set
	{
		typedef int ValueType;
		typedef HashBucket<K, ValueType, KeyofValue, HF> HT;

		struct KeyofValue
		{
			const K &operator()(const ValueType& data)
			{
				return data;
			}
		};

	public:
		typename typedef HT::iterator iterator;//前面加typename的作用就是告诉操作系统typedef后面是一个类型
	public:
		unordered_set() : m_ht()
		{}

		iterator begin()
		{
			return m_ht.begin();
		}
		iterator end()
		{
			return m_ht.end();
		}

		size_t size() const
		{
			return m_ht.m_size();
		}

		iterator find(const K& key)
		{
			return m_ht.find();
		}
		iterator insert(const ValurType & val)
		{
			return m_ht.insert();
		}
		iterator erase(const ValurType & val)
		{
			return m_ht.erase();
		}

	private:
		HT m_ht;
	};

需要注意的是map中的value是pair类型,对于map最重要的就是[]的重载,map的基本实现其实本质就是HashBucket的修改,重新封装一下,对于set来说,value就是int,其他部分也与map类似

map与set都使用了哈希桶的底层结构实现,其特点主要是空间利用率比较高,哈希桶本质是一个二维指针数组,数组中存的是单链表,每次insert都相当于单链表的头插,删除分为头删和后删

发布了149 篇原创文章 · 获赞 27 · 访问量 5032

猜你喜欢

转载自blog.csdn.net/qq_44783220/article/details/104271015