2016-11-18 6 views
0

C++에서 해시 맵을 구현했습니다. 해시 함수를 제외한 모든 것이 잘 작동합니다.다양한 키 유형에 대해 해시 함수를 구현하는 방법은 무엇입니까?

해시 맵에 다양한 변수 유형을 사용할 수 있도록 요소의 템플릿 클래스가 있습니다. 다음은 요소에 대한 코드입니다.

template <class KeyType, class ValType> 
class MapElem 
{ 
public: 
    typedef KeyType ktype; 
    typedef ValType vtype; 

    KeyType key; 
    ValType val; 

    MapElem* link; // singly linked list 
}; 

해시 함수 코드.

template <class HashMapElemType> 
unsigned int 
HashMap<HashMapElemType>::hashfunction(const KeyType k) 
{ 
    unsigned int hashIndex = 0; 



    if (typeid(KeyType).name() == typeid(std::string).name()) 
    { 
     unsigned int hashIndex = 0; 

     const char* c = k.c_str(); 

     unsigned int i = 0; 
     int index = 0; 
     int shift = 0; 

     while (c[index] != '\0') 
     { 
      if (shift == 32) 
       shift = 0; 
      i += ((int) c[index++]) << shift; 
      shift += 8; 
     } 

     hashIndex = i; 
    } 
    else if (typeid(KeyType).name() == typeid(float).name()) 
    { 
     float f = k; 
     hashIndex = (unsigned int) f; 
    } 
    else if (typeid(KeyType).name() == typeid(int).name()) 
    { 
     int i = k; 
     hashIndex = (unsigned int) i; 
    } 
    else 
    { 
     hashIndex = k; 
    } 

    hashIndex = hashIndex % divisor; 

    return hashIndex; 
} 

그리고 해시 함수에서 형식 변환에 대한 컴파일 오류가 있습니다. 왜 오류가 발생하는지 이해하지만 해결 방법을 모르겠습니다. 서로 다른 키 유형의 해시 값을 얻는 방법에 대해 궁금합니다.

오 여기 enter image description here

+1

그래서 ... 오류가 있습니까? – George

+0

typeid에 이름이 있으므로 임의의 유형을 무언가에 캐스트 할 수 없습니다. if 문은 런타임에 실행되며 컴파일 할 때 유형 시스템에 영향을주지 않습니다. 모든 코드 경로는 각 키 유형에 대해 컴파일해야하며 항상 유효한 것은 아닙니다. 아마도 부분적으로 전문화 된 펑터를하고 싶을 것입니다. 또는 어쩌면 당신의 실수는 완전히 다른 것입니다 ... – xaxxon

답변

0

귀하의 해시 함수는 컨테이너 클래스의 외부에 구현 된 키 유형에 템플릿 기능을해야합니다 오류입니다. 그러면 실제로 해시 맵을 사용하는 각 키 유형에 대해 템플릿 함수를 특수화 할 수 있습니다. 이렇게하면 형식 검사가 런타임에서 컴파일 타임으로 바뀌어보다 빠르고 안전합니다.

// hash function prototype, no implementation 
template<typename T> unsigned int CalculateHash(const T& v); 

// hash function specialization for std::string 
template<> unsigned int CalculateHash(const std::string& v) 
{ 
    // your hash function for std::string ... 
} 

컨테이너 구현 내에서 일반 해시 함수를 사용하여 키의 해시 값을 생성 할 수 있습니다.

template <class HashMapElemType> 
unsigned int HashMap<HashMapElemType>::hashfunction(const KeyType& k) 
{ 
    // delegate to global hash function template 
    return ::CalculateHash<KeyType>(k); 
} 
+0

정말 도움이되고 잘 작동합니다. 고맙습니다. – Uni

+0

반갑습니다. 도움이 된 것을 기쁘게 생각합니다. – smocoder