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