2008-11-05 1 views
30

저는 C++에 비교적 익숙합니다. Java에서는 해시 맵을 인스턴스화하고 사용하는 것이 쉽습니다. C++에서 간단한 방법으로 처리하는 방법을 알고 싶습니다. 많은 구현을 보았으므로 그 중 어느 것도 나에게 단순 해 보이지 않았습니다.C++의 간단한 hashmap 구현

답변

26

대부분의 컴파일러는 std::hash_map을 정의해야합니다. C++0x 표준에서는 표준 라이브러리의 일부가 std::unordered_map입니다. STL Page은 상당히 표준 적입니다. Visual Studio를 사용하는 경우 Microsoft에 페이지가 있습니다.

클래스를 키가 아닌 값으로 사용하려면 특별한 작업을 수행 할 필요가 없습니다. int, char, bool 및 심지어 char *과 같은 모든 기본 유형은 hash_map의 키로 "그냥 작동해야"합니다. 그러나, 다른 것들을 위해서 당신은 당신 자신의 해싱과 평등 함수를 정의해야만하고, 클래스에서 그들을 감싸는 "펑터"를 작성해야 할 것입니다.

이 클래스는 MyClass라고 가정하면 당신은 이미 정의 :

size_t MyClass::HashValue() const { /* something */ } 
bool MyClass::Equals(const MyClass& other) const { /* something */ } 

당신은 객체에서 그 방법을 포장이 펑터를 정의해야합니다.

struct MyClassHash { 
    size_t operator()(const MyClass& p) const { 
    return p.HashValue(); 
    } 
}; 

struct MyClassEqual { 
    bool operator()(const MyClass& c1, const MyClass& c2) const { 
    return c1.Equals(c2); 
    } 
}; 

그리고 당신의 hash_map/hash_set로 인스턴스화 : 그 후 예상대로

hash_map<MyClass, DataType, MyClassHash, MyClassEqual> my_hash_map; 
hash_set<MyClass, MyClassHash, MyClassEqual> my_hash_set; 

모든 것이 작동합니다.

+0

유닉스를 사용하고 있다는 사실을 잊어 버렸습니다. 코딩 한 예제는 매우 단순 해 보입니다. 하지만 HashValue() 메서드는 직접 만들어야합니다. 맞습니까? Java에 Object 클래스에 대한 기본 hashcode() 메서드가 있기 때문에 C++에서 어떻게 작동하는지 알지 못합니다. –

+0

답변에 대한 설명을 추가했습니다. 또한, 부스트 물건도 권장되었습니다 - 그것은 유사하지만, 학습 (일부의) 부스트는 완전히 새로운 언어를 배우는 것과 같을 수 있습니다. 순서가 매겨지지 않은 것은 시작하기에 나쁜 곳이 아니다. – hazzen

3

부스트의 unordered 클래스를 사용해보세요.

16

C++에서 해시 맵을 사용하는 것은 쉽습니다! 표준 C++ 맵을 사용하는 것과 같습니다. 컴파일러/라이브러리 구현을 unordered_map으로 사용하거나 boost 또는 다른 공급 업체에서 제공하는 것을 사용하십시오. 다음은 간단한 샘플입니다. 당신이 주어진 링크를 따라 가면 더 많은 것을 발견 할 수 있습니다.

#include <unordered_map> 
#include <string> 
#include <iostream> 

int main() 
{ 
    typedef std::tr1::unordered_map< std::string, int > hashmap; 
    hashmap numbers; 

    numbers["one"] = 1; 
    numbers["two"] = 2; 
    numbers["three"] = 3; 

    std::tr1::hash<std::string> hashfunc = numbers.hash_function(); 
    for(hashmap::const_iterator i = numbers.begin(), e = numbers.end() ; i != e ; ++i) { 
     std::cout << i->first << " -> " << i->second << " (hash = " << hashfunc(i->first) << ")" << std::endl; 
    } 
    return 0; 
}