]> git.llucax.com Git - z.facultad/75.29/susanita.git/blob - src/hashtable.cpp
Hacer que todos_h_comprometidos() sea O(1).
[z.facultad/75.29/susanita.git] / src / hashtable.cpp
1 #include "hashtable.h"
2
3 /// Constructor
4 HashTable::
5 HashTable(size_type size):
6         table(size)
7 {
8 }
9
10 /// Función de hash
11 HashTable::size_type
12 HashTable::
13 hash(const std::string& val)
14 {
15         size_type h = 0;
16         for (unsigned char* p = (unsigned char*)val.c_str(); *p != '\0';
17                         p++)
18         {
19                 h = 37 * h + *p;
20         }
21         return h % table.size();
22 }
23
24 // Uso interno
25 namespace
26 {
27         /// Functor para encontrar pares con clave igual
28         struct ClaveIgualA
29         {
30                 const std::string& clave;
31                 ClaveIgualA(const std::string& clave): clave(clave) {}
32                 bool operator()(const HashTable::pair_type& par)
33                 {
34                         return par.first == clave;
35                 }
36         };
37 }
38
39 /// Agrega entrada
40 void *&
41 HashTable::
42 operator[](const std::string& key)
43 {
44         size_type pos = hash(key);
45         list_type::iterator par = std::find_if(table[pos].begin(),
46                         table[pos].end(), ClaveIgualA(key));
47         if (par == table[pos].end()) // No encontrada
48         {
49                 // La agrego
50                 table[pos].push_back(pair_type(key, 0));
51                 return table[pos].back().second;
52         }
53         else return par->second;
54 }
55