2011-09-17 7 views
4

keystd::set<int>boost::unordered_map<key,value>을 사용하고 싶습니다. 정수 집합은 기본 제공 형식이 아니므로 내 자신의 해시 함수를 제공해야한다고 가정했습니다 (또는 boost's hash_range을 사용하려고 생각했습니다).boost :: unordered_map - 해시 std :: set <int>에 대한 사용자 지정 해시 함수를 지정해야합니까?

그러나 해시 함수 나 동등 조건부를 제공하지 않고 해시 맵을 초기화하려고했는데 gcc가 불평하지 않았습니다. 여기서 무슨 일이 일어나고있는거야? STL 컨테이너를 모두 해시 할만큼 충분히 영리합니까? 사용자 지정 해시 함수를 사용하는 것보다 느려질 수 있습니까? boost::hash_range을 사용하면 어떨까요?

미리 감사드립니다. the Boost documentation 따르면

+0

실제로 전체 프로그램을 실행 파일에 연결 했습니까? –

+0

예, 정상적으로 실행됩니다. 원래 std :: map (나중에 해시 비즈니스를 처리 할 것임)을 사용하여 unordered_map으로 대체했습니다. – Egon

+0

아, 죄송합니다. 표준 버전이 아니라 부스트 버전에 대해 말씀하시는 것입니다. 신경 쓰지 마. 당신은 여전히 ​​std 버전을 사용할 수 있으며 다음과 같은 boost-hasher를 사용할 수 있습니다 :-) –

답변

3

:

디폴트 해시 함수

Boost.Hash

그리고 the documentation for Boost.Hash에있어서, 디폴트 해시 함수는 표준 컨테이너 설치되어있다. 따라서 이미 std::set으로 작성된 해시 함수가 있습니다. Boost 해시 컨테이너는 자동으로 해시 세트를 만드는 방법을 알기에 현명하지 않지만 이미 제공되는 구현을 사용할만큼 똑똑합니다.

희망이 도움이됩니다.

3

기본값 인 boost::hash<Key>이 선택됩니다. 또한 라이브러리 확장 기술 보고서 ​​문제 목록의 문제 6.18에서 피터 Dimov에 의해 제안 된 확장 (구현

integers 
floats 
pointers 
strings 

: 자사의 문서에 따르면

가 TR1을 준수으로

, 그것은 작동합니다

arrays 
std::pair 
the standard containers. 
extending boost::hash for custom types. 

http://www.boost.org/doc/html/hash.html

,691 : 페이지 63)이 지원을 추가

그렇습니다. 부스트는 STL 컨테이너를 해싱 할만큼 충분히 똑똑합니다. 특정 유스 케이스 인 set을 알지 못하는 한 나 자신의 해시 기능을 제공하는 데있어 어떤 점도 의심 스럽다.