2012-06-05 3 views
0
#include <ext/hash_map> 

using namespace std; 

class hash_t : public __gnu_cxx::hash_map<const char*, list<time_t> > { }; 
hash_t hash; 

... 

Je rencontre des problèmes lors de l'utilisation de cette hash_map. Le const char * im utilisant comme une clé est toujours un nombre de 12 longueur avec ce format 58412xxxxxxx. Je sais qu'il y a 483809 nombres différents, donc ça devrait être la taille hash_map après avoir tout inséré, mais je n'ai que 193 entrées.hash_map ne fonctionne pas

hash_t::iterator it = hash.find(origen.c_str()); 
if (it != hash.end()) { //Found 

    x++; 
    (*it).second.push_front(fecha);   
} 
else { //Not found 

    y++; 
    list<time_t> lista(1, fecha); 
    hash.insert(make_pair(origen.c_str(), lista));   
} 

La même procédure fonctionne parfaitement en utilisant des dictionnaires de python (je reçois le nombre correct d'entrées) mais pas même à proximité en utilisant C++. Est-il possible que chaque clé commence par 58412 (en fait presque toutes les clés, mais pas toutes, et c'est la raison pour laquelle je ne veux pas couper ces 5 caractères), je reçois beaucoup de collisions?

+0

Nous ne sommes plus en Python, Toto. –

+0

A changé quelques lignes et l'ai fait fonctionner avec tr1 :: unordered_map – Alex

Répondre

4

const char* n'est pas bon pour une clé, puisque vous avez maintenant la comparaison de pointeur au lieu de la comparaison de chaîne (aussi, vous avez probablement des pointeurs pendants, la valeur de retour de c_str() n'est pas utilisable à long terme).

Utilisez plutôt hash_map<std::string, list<time_t> >.

+0

Et ce qui serait une bonne clé? Est-ce qu'une chaîne normale serait ok si j'utilise, par exemple, boost :: unordered_map? – Alex

+0

Lorsque j'essaie d'utiliser une chaîne directement, elle ne sera pas compilée. C'est la raison pour laquelle je suis allé pour const char * – Alex

+2

@Alex Donc oncoe ne compile pas vous choisissez une approche complètement différente au lieu de la faire compiler? Pourquoi ne compile-t-il pas? Peut-il y avoir aucune fonction de hachage appropriée pour 'std :: string'? –

1

Si votre clé est char*, vous comparez non les chaînes, mais les pointeurs, ce qui fait que votre hashmap fonctionne différemment de ce que vous attendez. Pensez à utiliser const std::string pour les clés, donc ils sont comparés en utilisant l'ordre lexicographique

+0

Ok. J'ai compris. Des suggestions sur la façon de contourner ce problème? – Alex

+0

Lorsque j'utilise des chaînes comme clé, il ne compile pas. C'est la raison pour laquelle je suis allé pour char * sur la première place – Alex

+0

Découvrez [ces] (http://forums.devshed.com/c-programming-42/tip-about-stl-hash-map-and-string-55093 .html) [liens] (http://gcc.gnu.org/ml/libstdc++/2002-04/msg00107.html) sur pourquoi 'hash_map <>' ne fonctionne pas avec 'string's et comment réparer le problème – Attila