Qual é a melhor maneira de trabalhar com hashmap em C++
Ué… igual se trabalha no Java. Veja o exemplo (adaptado da Wiki americana):
[code]#include <iostream>
#include <map>
#include <utility> // make_pair
using namespace std;
int main()
{
map<char, int> myMap;
//Insere elementos no mapa
myMap.insert(pair<char, int>('a', 1));
myMap.insert(pair<char, int>('b', 2));
myMap.insert(pair<char, int>('c', 3));
myMap.insert(mapType::value_type('d', 4)); // todos os containers padrão tem esse typedef
myMap.insert(make_pair('e', 5)); // Também é possível usar a função makePair
// apaga o primeiro elemento do mapa
map<char, int>::iterator iter = myMap.begin();
myMap.erase(iter);
// escreve o tamanho do mapa
cout << "Tamanho de myMap: " << myMap.size() << '\n';
cout << "Entre uma chave para busca: ";
char c;
cin >> c;
// find irá retornar o elemento onde a chave foi encontrada
// or ou o fim do mapa, se não for
iter = myMap.find(c);
if( iter != myMap.end() )
cout << "O valor é: " << iter->second << '\n';
else
cout << "Essa chave não está no mapa" << '\n';
//Uma forma mais fácil é usar o operador de []
cout << "O valor é: " << myMap[c] << '\n';
//Limpa o mapa
myMap.clear();
}
[/code]
Só lembre-se que como toda classe da STL, o map funciona através de cópia de valores. Se você tiver objetos complexos ao invés de tipos primitivos (como no exemplo), talvez fosse interessante usar os smart pointers da boost.
Só fique atento pois caso você prefira trabalhar com cópia, a performance pode cair muito caso seu operador de = e seu construtor de cópia não sejam bem eficientes. E o ideal é dar para esses dois caras a garantia de nothrow.