2008-12-04 13 views
0

J'essaie d'utiliser l'implémentation SGI STL que j'ai téléchargée de leur site. Je veux utiliser un hashmap, car je dois stocker environ 5.000.000 d'enregistrements, mais cela devrait être bon: je dois pouvoir y accéder très rapidement. J'ai essayé stedext::hash_map, mais c'était très lent car je ne pouvais pas définir la taille initiale. Soit dit en passant, est-ce possible? Si j'ajoute le chemin supplémentaire à MS Visual Studio, je ne peux même pas compiler l'exemple à partir du site SGI. Je reçois un message d'erreur:Comment utiliser SGI STL hash_map?

error C2061: syntax error : identifier 'T'. 

Est-ce que quelqu'un d'autre a rencontré de tels problèmes?

+2

Avez-vous essayé? http://code.google.com/p/google-sparsehash/ – strager

Répondre

1

Je l'ai utilisé un certain nombre de fois sans problèmes, bien que je l'ai utilisé avec gcc (à la fois sur Windows et Linux) et non sur Visual Studio. Pour une utilisation réelle, la documentation est here.

Vous pouvez spécifier le nombre de seaux à réserver à l'aide

void resize(size_type n) 

En ce qui concerne votre problème avec identifiant T, je suppose que vous avez oublié de remplacer un argument de modèle, appelé T, avec un type réel. Si vous ne pouvez pas le comprendre, collez un extrait de code de la manière dont vous utilisez hash_map.

Exemple de la documentation:

#include <hash_map> 
#include <iostream> 

struct eqstr 
{ 
    bool operator()(const char* s1, const char* s2) const 
    { 
    return strcmp(s1, s2) == 0; 
    } 
}; 

int main() 
{ 
    std::hash_map<const char*, int, hash<const char*>, eqstr> months; 

    months["january"] = 31; 
    months["february"] = 28; 
    months["march"] = 31; 
    months["april"] = 30; 
    months["may"] = 31; 
    months["june"] = 30; 
    months["july"] = 31; 
    months["august"] = 31; 
    months["september"] = 30; 
    months["october"] = 31; 
    months["november"] = 30; 
    months["december"] = 31; 

    std::cout << "september -> " << months["september"] << endl; 
    std::cout << "april  -> " << months["april"] << endl; 
    std::cout << "june  -> " << months["june"] << endl; 
    std::cout << "november -> " << months["november"] << endl; 
} 

Bien sûr, vous pouvez utiliser std :: string au lieu de char * si vous le souhaitez:

std::hash_map<std::string, int, hash<std::string>, eqstr> months; 
0

Existe-t-il d'autres messages d'erreur indiquant quand vous essayez de construire/compiler votre projet?
Vous vous avez mentionné ...

a ajouté un répertoire supplémentaire à un projet où la STL SGI est.

Pourriez-vous développer cela un peu? Il existe de nombreux endroits où vous pouvez ajouter des répertoires dans les paramètres du projet Visual Studio. c'est-à-dire ajouter des chemins d'en-tête supplémentaires, des chemins de bibliothèque supplémentaires, etc. Où avez-vous ajouté votre répertoire?

0

Cela semble raisonnable. Quelle est la structure de votre répertoire STL? Avez-vous obtenu tous les fichiers SGI STL de leur site Web ou juste un seul? Il se peut que vous manquiez un fichier de dépendance qui entraîne l'erreur que vous voyez.

0

J'ai téléchargé la version compressée de cette bibliothèque, il n'y a que des fichiers d'en-tête dans ce fichier zip. Il existe une autre option sous Linker, elle appelle des dépendances supplémentaires, mais il n'y a que des fichiers * .lib. La ligne de commande de mes paramètres ressemble:

/Od /I "C:\SGI" /D "_MBCS" Gm /EHsc /RTC1 /MDd /Fo"Debug\\"/Fd"Debug\vc90.pdb" /W3 /nologo /c /ZI /TP /errorReport:prompt 

Je ne pas s'il est plus facile à utiliser ....

0

Oui, vous trouverez uniquement les fichiers d'en-tête, qui est indiqué sur le site SGI STL. Comme vous avez remarqué que les dépendances de liens sont pour les fichiers .lib uniquement, ne vous embêtez pas à y ajouter quoi que ce soit.

Vous compilez l'exemple posté par Dan toujours correct? Vous devrez peut-être spécifier vos en-têtes d'inclusion en utilisant des guillemets plutôt que des crochets. Il faut donc utiliser ...

#include "hash_map" 

au lieu de ...

#include <hash_map> 

Il pourrait être un problème avec la façon dont les fichiers d'inclusion sont recherchés par le compilateur. Comme une enquête supplémentaire quelle version de Visual Studio utilisez-vous?

0

Comme cela a été souligné dans un fil de discussion que j'ai remarqué sur un forum de discussion à propos de ce problème, l'implémentation SGI STL ne semble pas avoir été mise à jour depuis très longtemps. Sur la page de téléchargement, il mentionne même le 8 juin 2000 comme la dernière fois qu'il a été mis à jour. Je soupçonne que l'implémentation de SGI STL sous VS 2005/2008 est plus problématique que sa valeur.

Je suggère de vérifier certaines alternatives STL ...

Les deux sont mis à jour régulièrement.