rev |
line source |
nuclear@0
|
1 #ifndef HASHTABLE_H_
|
nuclear@0
|
2 #define HASHTABLE_H_
|
nuclear@0
|
3
|
nuclear@0
|
4 #include <list>
|
nuclear@0
|
5 #include <vector>
|
nuclear@0
|
6
|
nuclear@0
|
7 template <class KeyT, class ValT>
|
nuclear@0
|
8 struct Pair {
|
nuclear@0
|
9 KeyT key;
|
nuclear@0
|
10 ValT val;
|
nuclear@0
|
11 };
|
nuclear@0
|
12
|
nuclear@0
|
13 template <class KeyType, class ValType>
|
nuclear@0
|
14 class HashTable {
|
nuclear@0
|
15 private:
|
nuclear@0
|
16
|
nuclear@0
|
17 size_t size;
|
nuclear@0
|
18 std::vector<std::list<Pair<KeyType, ValType> > > table;
|
nuclear@0
|
19 //std::list<Pair<KeyType, ValType> > table[100];
|
nuclear@0
|
20
|
nuclear@0
|
21 unsigned int (*HashFunc)(const KeyType &key, unsigned long size);
|
nuclear@0
|
22 unsigned int Hash(const KeyType &key) {return (unsigned int)HashFunc(key, (unsigned long)size);}
|
nuclear@0
|
23
|
nuclear@0
|
24 public:
|
nuclear@0
|
25
|
nuclear@0
|
26 HashTable(unsigned long size = 101);
|
nuclear@0
|
27 ~HashTable();
|
nuclear@0
|
28
|
nuclear@0
|
29 void SetHashFunction(unsigned int (*HashFunc)(const KeyType&, unsigned long));
|
nuclear@0
|
30
|
nuclear@0
|
31 void Insert(KeyType key, ValType value);
|
nuclear@0
|
32 void Remove(KeyType key);
|
nuclear@0
|
33
|
nuclear@0
|
34 Pair<KeyType, ValType> *Find(KeyType key);
|
nuclear@0
|
35 };
|
nuclear@0
|
36
|
nuclear@0
|
37 //// std hash function
|
nuclear@0
|
38 //template <class KeyType>
|
nuclear@0
|
39 //unsigned int _HashFunction(const KeyType &key, unsigned long size) {
|
nuclear@0
|
40 // return (size_t)key % size;
|
nuclear@0
|
41 //}
|
nuclear@0
|
42
|
nuclear@0
|
43 // hash table member functions
|
nuclear@0
|
44 template <class KeyType, class ValType>
|
nuclear@0
|
45 HashTable<KeyType, ValType>::HashTable(unsigned long size) {
|
nuclear@0
|
46 this->size = size;
|
nuclear@0
|
47 //HashFunc = _HashFunction;
|
nuclear@0
|
48 table.resize(size);
|
nuclear@0
|
49 }
|
nuclear@0
|
50
|
nuclear@0
|
51 template <class KeyType, class ValType>
|
nuclear@0
|
52 HashTable<KeyType, ValType>::~HashTable() {
|
nuclear@0
|
53 for(unsigned long i=0; i<size; i++) {
|
nuclear@0
|
54 table[i].erase(table[i].begin(), table[i].end());
|
nuclear@0
|
55 }
|
nuclear@0
|
56 }
|
nuclear@0
|
57
|
nuclear@0
|
58 template <class KeyType, class ValType>
|
nuclear@0
|
59 void HashTable<KeyType, ValType>::SetHashFunction(unsigned int (*HashFunc)(const KeyType&, unsigned long)) {
|
nuclear@0
|
60 this->HashFunc = HashFunc;
|
nuclear@0
|
61 }
|
nuclear@0
|
62
|
nuclear@0
|
63 template <class KeyType, class ValType>
|
nuclear@0
|
64 void HashTable<KeyType, ValType>::Insert(KeyType key, ValType value) {
|
nuclear@0
|
65 Pair<KeyType, ValType> newpair;
|
nuclear@0
|
66 newpair.key = key;
|
nuclear@0
|
67 newpair.val = value;
|
nuclear@0
|
68
|
nuclear@0
|
69 table[Hash(key)].push_back(newpair);
|
nuclear@0
|
70 }
|
nuclear@0
|
71
|
nuclear@0
|
72 template <class KeyType, class ValType>
|
nuclear@0
|
73 void HashTable<KeyType, ValType>::Remove(KeyType key) {
|
nuclear@0
|
74
|
nuclear@0
|
75 unsigned int pos = Hash(key);
|
nuclear@0
|
76
|
nuclear@0
|
77 std::list<Pair<KeyType, ValType> >::iterator iter = table[pos].begin();
|
nuclear@0
|
78 while(iter != table[pos].end()) {
|
nuclear@0
|
79 if(iter->key == key) {
|
nuclear@0
|
80 table[pos].erase(iter);
|
nuclear@0
|
81 return;
|
nuclear@0
|
82 }
|
nuclear@0
|
83 iter++;
|
nuclear@0
|
84 }
|
nuclear@0
|
85 }
|
nuclear@0
|
86
|
nuclear@0
|
87 template <class KeyType, class ValType>
|
nuclear@0
|
88 Pair<KeyType, ValType> *HashTable<KeyType, ValType>::Find(KeyType key) {
|
nuclear@0
|
89
|
nuclear@0
|
90 unsigned int pos = Hash(key);
|
nuclear@0
|
91
|
nuclear@0
|
92 std::list<Pair<KeyType, ValType> >::iterator iter = table[pos].begin();
|
nuclear@0
|
93 while(iter != table[pos].end()) {
|
nuclear@0
|
94 if(iter->key == key) {
|
nuclear@0
|
95 return &(*iter);
|
nuclear@0
|
96 }
|
nuclear@0
|
97 iter++;
|
nuclear@0
|
98 }
|
nuclear@0
|
99
|
nuclear@0
|
100 return 0;
|
nuclear@0
|
101 }
|
nuclear@0
|
102
|
nuclear@0
|
103 #endif // HASHTABLE_H_ |