저는 C++에 비교적 익숙합니다. Java에서는 해시 맵을 인스턴스화하고 사용하는 것이 쉽습니다. C++에서 간단한 방법으로 처리하는 방법을 알고 싶습니다. 많은 구현을 보았으므로 그 중 어느 것도 나에게 단순 해 보이지 않았습니다.C++의 간단한 hashmap 구현
답변
대부분의 컴파일러는 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;
모든 것이 작동합니다.
부스트의 unordered 클래스를 사용해보세요.
boost.unordered 및 그 data structure을 살펴보십시오.
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;
}
제네릭 형식 키 - 값 쌍과 별도의 체인 전략 기본 해시 테이블에 밖으로 Simple Hash Map (Hash Table) Implementation in C++ 확인합니다.
유닉스를 사용하고 있다는 사실을 잊어 버렸습니다. 코딩 한 예제는 매우 단순 해 보입니다. 하지만 HashValue() 메서드는 직접 만들어야합니다. 맞습니까? Java에 Object 클래스에 대한 기본 hashcode() 메서드가 있기 때문에 C++에서 어떻게 작동하는지 알지 못합니다. –
답변에 대한 설명을 추가했습니다. 또한, 부스트 물건도 권장되었습니다 - 그것은 유사하지만, 학습 (일부의) 부스트는 완전히 새로운 언어를 배우는 것과 같을 수 있습니다. 순서가 매겨지지 않은 것은 시작하기에 나쁜 곳이 아니다. – hazzen