unordered_map和unordered_set的设计
#pragma once
#include"HashTable.h"
namespace aqc
{template<class K,class V,class Hash=HashFunc<K>>class unordered_map{public:struct MapKeyOfT{const K& operator()(const pair<K, V>& kv)//pair对象是const返回值也得是const{return kv.first;}};typedef typename HashBucket::HashTable<K, pair<const K, V>, MapKeyOfT, Hash>::iterator iterator;typedef typename HashBucket::HashTable<K, pair<const K, V>, MapKeyOfT, Hash>::const_iterator const_iterator;iterator begin(){return _ht.begin();//普通set调用,返回的是普通哈希迭代器,接收的是const哈希迭代器,要加一个构造函数}iterator end(){return _ht.end();}const_iterator begin()const{return _ht.begin();//const set调用,返回const 哈希迭代器}const_iterator end()const{return _ht.end();}iterator find(const K& key){return _ht.Find(key);}bool erase(const K& key){return _ht.Erase(key);}pair<iterator, bool> insert(const pair<K,V>& kv){return _ht.Insert(kv);}V& operator[](const K& key){pair<iterator,bool> ret=insert(make_pair(key,V()));return ret.first->second;}private:HashBucket::HashTable<K, pair<const K, V>, MapKeyOfT, Hash> _ht;};
}
1.unordered_map的模板参数,键类型K,值类型V,把K变成size_t的仿函数类类型Hash,
2.unordered_map封装的是哈希表对象,并且封装的是链地址法开散列实现的哈希表,所以模板参数参数,第一个键类型,第二个节点数据类型,剩下两个不说了
3.接口就封装一下就是了,值得一说的就是operator[ ],底层是用insert去插入<key, V()>的键值对,然后无论插入成功还是失败,返回迭代器对应节点的数据的值V的引用
#pragma once
#include"HashTable.h"namespace aqc
{template<class K, class Hash = HashFunc<K>>//HashFUnc展开在全局域中class unordered_set{struct SetKeyOfT{size_t operator()(const K& key){return key;}};public:typedef typename HashBucket::HashTable<K, K, SetKeyOfT, Hash>::const_iterator iterator;//set节点的_data是K不允许被修改的,用const_iterator包装,返回的const K&和const K*使其值不会被修改typedef typename HashBucket::HashTable<K, K, SetKeyOfT, Hash>::const_iterator const_iterator;iterator begin(){return _ht.begin();//普通set调用,返回的是普通哈希迭代器,接收的是const哈希迭代器,要加一个构造函数}iterator end(){return _ht.end();}const_iterator begin()const{return _ht.begin();//const set调用,返回const 哈希迭代器}const_iterator end()const{return _ht.end();}iterator find(const K& key){return _ht.Find(key);}bool erase(const K& key){return _ht.Erase(key);}pair<iterator, bool> insert(const K& key){return _ht.Insert(key);}private:HashBucket::HashTable<K, K, SetKeyOfT, Hash> _ht;};
}
1.unordered_set的模板参数,键类型K,这同时也是节点数据类型,把K变成size_t的仿函数类类型Hash
2.unordered_set封装的是哈希表对象,并且封装的是链地址法开散列实现的哈希表,所以模板参数参数,第一个键类型,第二个节点数据类型,剩下两个不说了
封装下的insert接口
在哈希表层用的是insert(T),也就是参数是节点的数据类型,在map层封装的就是insert(pair<K,V>),
在set层insert(K),有点意思