문제

나는 C ++를 비교적 처음으로 사용합니다. Java에서는 해시 맵을 인스턴스화하고 사용하기가 쉽습니다. C ++에서 간단한 방식으로 수행하는 방법을 알고 싶습니다. 많은 다른 구현을 보았고 그중 어느 것도 나에게 간단하게 보이지 않았기 때문입니다.

도움이 되었습니까?

해결책

대부분의 컴파일러는 정의해야합니다 std::hash_map 당신을 위한; 앞으로 C++0x 표준, 그것은 표준 라이브러리의 일부가 될 것입니다. std::unordered_map. 그만큼 STL 페이지 그것은 상당히 표준입니다. Visual Studio를 사용하는 경우 마이크로 소프트 그것에 페이지가 있습니다.

수업을 키가 아닌 값으로 사용하려면 특별한 일을 할 필요가 없습니다. 모든 원시 유형 (같은 것들 int, char, bool 그리고 심지어 char *) 열쇠로 "그냥 작동"해야합니다. hash_map. 그러나 다른 어떤 것에 대해서는 자신의 해싱 및 평등 기능을 정의한 다음 클래스에 랩핑하는 "functors"를 작성해야합니다.

수업이 호출한다고 가정합니다 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;

그 이후로 모든 것이 예상대로 작동해야합니다.

다른 팁

C ++에서 해시 맵을 사용하는 것은 쉽습니다! 표준 C ++ 맵을 사용하는 것과 같습니다. 귀하의 컴파일러/라이브러리 구현을 사용할 수 있습니다. unordered_map 또는 제공된 것을 사용하십시오 후원, 또는 다른 공급 업체. 다음은 빠른 샘플입니다. 주어진 링크를 따르면 더 많은 것을 찾을 수 있습니다.

#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;
}

보세요 부스트, 그리고 그것 데이터 구조.

부스트를 시도하십시오 정렬되지 않은 클래스.

체크 아웃 C ++에서 간단한 해시 맵 (해시 테이블) 구현 일반 유형 키 값 쌍과 별도의 체인 전략이있는 기본 해시 테이블의 경우.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top