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都相当于单链表的头插,删除分为头删和后删