2009-05-17 8 views
2

J'ai implémenté ce code, mais échoue lors de la compilation (VC2008 Express Ed.):
Maintenant tout le code est ici.échoue en utilisant hash_map <vector<int>, string>, pourquoi?


#include <stdio.h> 
#include <vector> 
#include <string> 
#include <hash_map> 

using namespace std; 
using namespace stdext; 

typedef vector type_key; 

int main(int argc, char* argv[]) 
{ 
    type_key key; 

    hash_map<type_key, string> map_segment; 
    hash_map<type_key, string>::iterator iter_map_segment; 

    iter_map_segment = map_segment.find(key); 

    return 0; 
} 

L'utilisation de unordered_map entraîne également la même erreur. Mais le remplacement du conteneur par une erreur de carte ne se produit pas.


Que peut-on faire pour corriger?
Merci.

[edited]
info d'erreur:


------ Build started: Project: map_key_test, Configuration: Debug Win32 ------ 
Compiling... 
map_key_test.cpp 
c:\program files\microsoft visual studio 9.0\vc\include\xhash(75) : error C2440: 'type cast' : cannot convert from 'const type_key' to 'size_t' 
     No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 
     c:\program files\microsoft visual studio 9.0\vc\include\xhash(128) : see reference to function template instantiation 'size_t stdext::hash_value<_Kty>(const _Kty &)' being compiled 
     with 
     [ 
      _Kty=type_key 
     ] 
     c:\program files\microsoft visual studio 9.0\vc\include\xhash(127) : while compiling class template member function 'size_t stdext::hash_compare<_Kty,_Pr>::operator()(const _Kty &) const' 
     with 
     [ 
      _Kty=type_key, 
      _Pr=std::less<type_key> 
     ] 
     c:\program files\microsoft visual studio 9.0\vc\include\hash_map(78) : see reference to class template instantiation 'stdext::hash_compare<_Kty,_Pr>' being compiled 
     with 
     [ 
      _Kty=type_key, 
      _Pr=std::less<type_key> 
     ] 
     c:\program files\microsoft visual studio 9.0\vc\include\xhash(191) : see reference to class template instantiation 'stdext::_Hmap_traits<_Kty,_Ty,_Tr,_Alloc,_Mfl>' being compiled 
     with 
     [ 
      _Kty=type_key, 
      _Ty=std::string, 
      _Tr=stdext::hash_compare<type_key,std::less<type_key>>, 
      _Alloc=std::allocator<std::pair<const type_key,std::string>>, 
      _Mfl=false 
     ] 
     c:\program files\microsoft visual studio 9.0\vc\include\hash_map(88) : see reference to class template instantiation 'stdext::_Hash<_Traits>' being compiled 
     with 
     [ 
      _Traits=stdext::_Hmap_traits<type_key,std::string,stdext::hash_compare<type_key,std::less<type_key>>,std::allocator<std::pair<const type_key,std::string>>,false> 
     ] 
     c:\users\salamon\documents\visual studio 2008\projects\map_key_test\map_key_test.cpp(17) : see reference to class template instantiation 'stdext::hash_map<_Kty,_Ty>' being compiled 
     with 
     [ 
      _Kty=type_key, 
      _Ty=std::string 
     ] 
Build log was saved at "file://c:\Users\Salamon\Documents\Visual Studio 2008\Projects\map_key_test\Debug\BuildLog.htm" 
map_key_test - 1 error(s), 0 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

[edited]
Solution complète:


#include <stdio.h> 
#include <vector> 
#include <string> 
#include <hash_map> 
using namespace std; 
using namespace stdext; 

class Vector : public vector<int> 
{ 
public: 
    operator size_t() const { return (*this).size(); }; 
}; 
typedef Vector type_key; 

struct less_vector 
{ 
    bool operator()(const Vector & x, const Vector & y) const 
    { 
     if (x != y) 
      return true; 

     return false; 
    } 
}; 

struct greater_vector 
{ 
    bool operator()(const Vector & x, const Vector & y) const 
    { 
     if (x == y) 
      return true; 

     return false; 
    } 
}; 

int main(int argc, char* argv[]) 
{ 
    Vector key; 
    string str; 

    hash_map<Vector, string, hash_compare <Vector, less_vector > > map_segment; 
    hash_map<Vector, string, hash_compare <Vector, greater_vector > >::iterator iter_map_segment; 

    // 
    key.push_back(0); 
    key.push_back(1); 
    key.push_back(2); 
    str = "012"; 
    map_segment [key] = str; 
    // 
    key.clear(); 
    key.push_back(1); 
    key.push_back(0); 
    key.push_back(2); 
    str = "102"; 
    map_segment [key] = str; 
    // 
    key.clear(); 
    key.push_back(2); 
    key.push_back(1); 
    key.push_back(0); 
    str = "210"; 
    map_segment [key] = str; 
    // 
    key.clear(); 
    key.push_back(1); 
    key.push_back(0); 
    key.push_back(2); 

    iter_map_segment = map_segment.find(key); 

    return 0; 
} 
+1

Veuillez poster le texte de l'erreur que le compilateur vous donne. Les erreurs du compilateur donnent beaucoup d'informations qui aident à déboguer le problème. De plus, il sera plus utile pour les personnes qui ont la même erreur à l'avenir et qui sont à la recherche de cette erreur. –

Répondre

4

Tout d'abord, assurez-vous que l'en-tête que vous incluez existe vraiment sur votre installation.

Ensuite, hash_map se trouve dans l'espace de noms stdext, assurez-vous de rendre ce nom visible en le spécifiant explicitement comme stdext::hash_map, ou via une directive using. Troisièmement, où sont les arguments de modèle pour votre hash_map dans votre code? Je vois seulement hash_map et non hash_map<vector<int>,string>. Quatrièmement, je ne sais pas si std :: vector peut être utilisé comme clé de hachage pour une carte de hachage comme celle-ci. Vous devez définir une fonction de hachage pour votre clé (en implémentant un objet fonction hash_compare et en le passant au paramètre hash_map en tant que troisième paramètre de modèle). Quoi qu'il en soit stocker ces vecteurs par valeur n'est pas une bonne idée, vous devriez probablement envisager d'utiliser des pointeurs sur ces vecteurs comme des clés.

1

Même si cela fonctionne, je sens le poisson ... Dans quelles circonstances voulez-vous utiliser un vecteur-de-ints comme clé pour récupérer un attribut de chaîne d'une table de hachage?

Cela me semble médiocre/pas de conception ... il suffit de penser au coût de calcul de tous ces hashCodes pour commencer.

+0

Je vais évaluer votre poids, merci. – lsalamon

+0

Tout à fait d'accord que la recherche d'une chaîne basée sur un vecteur d'ints semble louche. Peut-être que c'est censé être l'inverse? – luke

+0

Cela peut sembler étrange mais ce n'est pas le cas. – lsalamon

0

Pour comparer les clés, <, ==,> les opérateurs doivent être définis. La fonction find() ne sait pas comment comparer les clés.

Questions connexes