hash_map和hash_multimap
hash_map
1 template <class Pair> 2 struct Select1st 3 { 4 const typename Pair::first_type& operator()(const Pair& x) const 5 { 6 return x.first; 7 } 8 }; 9 template <typename Key, typename Tp, typename Hash = std::hash<Key>, typename Equal=std::equal_to<Key> > 10 class MyHashmap 11 { 12 private: 13 typedef MyHashtable<std::pair<const Key, Tp>, Key, Hash, 14 Select1st<std::pair<const Key, Tp> >, Equal> HashTable; 15 HashTable m_hashtable; 16 17 public: 18 typedef typename HashTable::key_type key_type; 19 typedef typename HashTable::value_type value_type; 20 typedef typename HashTable::reference reference; 21 typedef typename HashTable::iterator iterator; 22 23 public: 24 MyHashmap() : m_hashtable(100) {} 25 explicit MyHashmap(size_t n) : m_hashtable(n) {} 26 27 public: 28 size_t size() const { return m_hashtable.size(); } 29 bool empty() const { return m_hashtable.empty(); } 30 void swap(MyHashmap& hs) { m_hashtable.swap(hs.m_hashtable); } 31 32 iterator begin() { return m_hashtable.begin(); } 33 iterator end() { return m_hashtable.end(); } 34 35 public: 36 std::pair<iterator, bool> insert(const value_type& obj) 37 { 38 return m_hashtable.insert_unique(obj); 39 } 40 iterator find(const key_type& key) { return m_hashtable.find(key); } 41 42 Tp& operator[](const key_type& key) 43 { 44 return m_hashtable.find_or_insert(value_type(key, Tp())).second; 45 } 46 47 size_t count(const key_type& key) const { return m_hashtable.count(key); } 48 49 size_t erase(const key_type& key) { return m_hashtable.erase(key); } 50 void erase(iterator it) { m_hashtable.erase(it); } 51 void clear() { m_hashtable.clear(); } 52 void resize(size_t hint) { m_hashtable.resize(hint); } 53 size_t bucket_count() const { return m_hashtable.bucket_count(); } 54 };
hash_multimap
1 template <typename Key, typename Tp, typename Hash = std::hash<Key>, typename Equal = std::equal_to<Key> > 2 class MyHashMultimap 3 { 4 private: 5 typedef MyHashtable<std::pair<const Key, Tp>, Key, Hash, 6 Select1st<std::pair<const Key, Tp> >, Equal> HashTable; 7 HashTable m_hashtable; 8 public: 9 typedef typename HashTable::key_type key_type; 10 typedef typename HashTable::value_type value_type; 11 typedef typename HashTable::reference reference; 12 typedef typename HashTable::iterator iterator; 13 public: 14 MyHashMultimap() : m_hashtable(100) {} 15 explicit MyHashMultimap(size_t n) : m_hashtable(n) {} 16 public: 17 size_t size() const { return m_hashtable.size(); } 18 size_t max_size() const { return m_hashtable.max_size(); } 19 bool empty() const { return m_hashtable.empty(); } 20 void swap(MyHashMultimap& hs) { m_hashtable.swap(hs.m_hashtable); } 21 22 iterator begin() { return m_hashtable.begin(); } 23 iterator end() { return m_hashtable.end(); } 24 public: 25 iterator insert(const value_type& __obj) 26 { 27 return m_hashtable.insert_equal(__obj); 28 } 29 iterator find(const key_type& key) { return m_hashtable.find(key); } 30 size_t count(const key_type& key) const { return m_hashtable.count(key); } 31 size_t erase(const key_type& key) { return m_hashtable.erase(key); } 32 void erase(iterator it) { m_hashtable.erase(it); } 33 void clear() { m_hashtable.clear(); } 34 35 public: 36 void resize(size_t __hint) { m_hashtable.resize(__hint); } 37 size_t bucket_count() const { return m_hashtable.bucket_count(); } 38 };
template <typename Key, typename Tp, typename Hash = std::hash<Key>, typename Equal = std::equal_to<Key> >class MyHashMultimap{private:typedef MyHashtable<std::pair<const Key, Tp>, Key, Hash,Select1st<std::pair<const Key, Tp> >, Equal> HashTable;HashTable m_hashtable;public:typedef typename HashTable::key_type key_type;typedef typename HashTable::value_type value_type;typedef typename HashTable::reference reference;typedef typename HashTable::iterator iterator;public:MyHashMultimap() : m_hashtable(100) {}explicit MyHashMultimap(size_t n) : m_hashtable(n) {}public:size_t size() const { return m_hashtable.size(); }size_t max_size() const { return m_hashtable.max_size(); }bool empty() const { return m_hashtable.empty(); }void swap(MyHashMultimap& hs) { m_hashtable.swap(hs.m_hashtable); }
iterator begin() { return m_hashtable.begin(); }iterator end() { return m_hashtable.end(); }public:iterator insert(const value_type& __obj){return m_hashtable.insert_equal(__obj);}iterator find(const key_type& key) { return m_hashtable.find(key); }size_t count(const key_type& key) const { return m_hashtable.count(key); }size_t erase(const key_type& key) { return m_hashtable.erase(key); }void erase(iterator it) { m_hashtable.erase(it); }void clear() { m_hashtable.clear(); }
public:void resize(size_t __hint) { m_hashtable.resize(__hint); }size_t bucket_count() const { return m_hashtable.bucket_count(); }};