implementação hashmap simples em C ++
Pergunta
Eu sou relativamente novo para C ++. Em Java, é fácil para mim para instanciar e usar um hashmap. Eu gostaria de saber como fazê-lo de uma forma simples em C ++, desde que eu vi muitas implementações diferentes e nenhum deles parecia simples para mim.
Solução
A maioria dos compiladores deve definir std::hash_map
para você; no padrão C++0x
vindo, será parte da biblioteca padrão como std::unordered_map
. A STL Página sobre ele é bastante normal. Se você usar Visual Studio, Microsoft tem uma página sobre ele.
Se você quiser usar a sua classe como o valor, não como a chave, então você não precisa fazer nada especial. Todos os tipos primitivos (coisas como int
, char
, bool
e até mesmo char *
) deve "apenas trabalho" como chaves em um hash_map
. No entanto, para qualquer outra coisa que você terá que definir suas próprias funções de hashing e igualdade e, em seguida, escrever "functors" que envolvê-los em uma classe.
Assumindo sua classe é chamado MyClass
e você já tiver definido:
size_t MyClass::HashValue() const { /* something */ }
bool MyClass::Equals(const MyClass& other) const { /* something */ }
Você precisará definir dois functors para embrulhar os mesmos métodos com objetos.
struct MyClassHash {
size_t operator()(const MyClass& p) const {
return p.HashValue();
}
};
struct MyClassEqual {
bool operator()(const MyClass& c1, const MyClass& c2) const {
return c1.Equals(c2);
}
};
E instancia seu hash_map
/ hash_set
como:
hash_map<MyClass, DataType, MyClassHash, MyClassEqual> my_hash_map;
hash_set<MyClass, MyClassHash, MyClassEqual> my_hash_set;
Tudo deve funcionar como esperado depois disso.
Outras dicas
Usando HashMaps em C ++ é fácil! É como usar mapa padrão C ++. Você pode usar o seu compilador implementação / biblioteca de unordered_map
ou usar o fornecido pelo boost , ou algum outro fornecedor. Aqui está um exemplo rápido. Você vai encontrar mais se você seguir os links lhe foram dadas.
#include <unordered_map>
#include <string>
#include <iostream>
int main()
{
typedef std::tr1::unordered_map< std::string, int > hashmap;
hashmap numbers;
numbers["one"] = 1;
numbers["two"] = 2;
numbers["three"] = 3;
std::tr1::hash< std::string > hashfunc = numbers.hash_function();
for( hashmap::const_iterator i = numbers.begin(), e = numbers.end() ; i != e ; ++i ) {
std::cout << i->first << " -> " << i->second << " (hash = " << hashfunc( i->first ) << ")" << std::endl;
}
return 0;
}
Dê uma olhada boost.unordered , e a sua estrutura de dados .
não ordenada aulas Try do impulso.
Confira simples Hash Mapa (Hash Table) Implementação em C ++ para uma tabela hash básico com tipo genérico chave- pares de valores e estratégia de encadeamento separado.