1 #include "MyHashTable.h"
2 template <typename Tp>
3 struct Identity
4 {
5 const Tp& operator()(const Tp& x) const { return x; }
6 };
7 template <typename Value, typename Hash = std::hash<Value>, typename Equal = std::equal_to<Value> >
8 class MyHashSet
9 {
10 private:
11 typedef MyHashtable<Value, Value, Hash, Identity<Value>, Equal> Hashtable;
12 Hashtable m_hashtable;
13 public:
14 typedef typename Hashtable::key_type key_type;
15 typedef typename Hashtable::value_type value_type;
16 typedef typename Hashtable::reference reference;
17 typedef typename Hashtable::iterator iterator;
18 public:
19 MyHashSet() : m_hashtable(100) {}
20 explicit MyHashSet(size_t n) : m_hashtable(n) {}
21
22 public:
23 size_t size() const { return m_hashtable.size(); }
24 size_t max_size() const { return m_hashtable.max_size(); }
25 bool empty() const { return m_hashtable.empty(); }
26 void swap(MyHashSet& hs) { m_hashtable.swap(hs.m_hashtable); }
27 iterator begin() const { return m_hashtable.begin(); }
28 iterator end() const { return m_hashtable.end(); }
29
30 public:
31 std::pair<iterator, bool> insert(const value_type& obj)
32 {
33 return m_hashtable.insert_unique(obj);
34 }
35 iterator find(const key_type& key) { return m_hashtable.find(key); }
36 size_t count(const key_type& key) const { return m_hashtable.count(key); }
37 size_t erase(const key_type& key) { return m_hashtable.erase(key); }
38 void erase(iterator it) { m_hashtable.erase(it); }
39 void clear() { m_hashtable.clear(); }
40 void resize(size_t hint) { m_hashtable.resize(hint); }
41 size_t bucket_count() const { return m_hashtable.bucket_count(); }
42 };
43
44 template <typename Value, typename Hash = std::hash<Value>, typename Equal = std::equal_to<Value> >
45 class MyHashMultiset
46 {
47 private:
48 typedef MyHashtable<Value, Value, Hash, Identity<Value>,Equal> Hashtable;
49 Hashtable m_hashtable;
50
51 public:
52 typedef typename Hashtable::key_type key_type;
53 typedef typename Hashtable::value_type value_type;
54 typedef typename Hashtable::reference reference;
55 typedef typename Hashtable::iterator iterator;
56 public:
57 MyHashMultiset() : m_hashtable(100) {}
58 explicit MyHashMultiset(size_t n) : m_hashtable(n) {}
59 public:
60 size_t size() const { return m_hashtable.size(); }
61 size_t max_size() const { return m_hashtable.max_size(); }
62 bool empty() const { return m_hashtable.empty(); }
63 void swap(MyHashMultiset& hs) { m_hashtable.swap(hs.m_hashtable); }
64 iterator begin() const { return m_hashtable.begin(); }
65 iterator end() const { return m_hashtable.end(); }
66 public:
67 iterator insert(const value_type& obj)
68 {
69 return m_hashtable.insert_equal(obj);
70 }
71 iterator find(const key_type& key) { return m_hashtable.find(key); }
72 size_t count(const key_type& key) const { return m_hashtable.count(key); }
73 size_t erase(const key_type& key) { return m_hashtable.erase(key); }
74 void erase(iterator it) { m_hashtable.erase(it); }
75 void clear() { m_hashtable.clear(); }
76 void resize(size_t hint) { m_hashtable.resize(hint); }
77 size_t bucket_count() const { return m_hashtable.bucket_count(); }
78 };