에 사용자 정의 키 유형을 지원하기 위해 std::unordered_set<Key>
그리고 std::unordered_map<Key, Value>
하나는 제공해야 operator==(Key, Key)
하고 해시 펑터 :
struct X { int id; /* ... */ };
bool operator==(X a, X b) { return a.id == b.id; }
struct MyHash {
size_t operator()(const X& x) const { return std::hash<int>()(x.id); }
};
std::unordered_set<X, MyHash> s;
그냥 쓸 더 편리 할 것 std::unordered_set<X>
로모그래퍼 기본 해시 유형에 대한 X
유형 컴파일러 및 라이브러리와 함께 주셔서처럼. 상담 후
- C ++ 표준 초안 N3242 §20.8.12 [unord.hash] 및 §17.6.3.4 [hash.requirements],
- 부스트.
- g ++
include\c++\4.7.0\bits\functional_hash.h
- VC10
include\xfunctional
- Stack Overflow의 다양한 관련 질문
전문화가 가능한 것 같습니다 std::hash<X>::operator()
.
namespace std { // argh!
template <>
inline size_t
hash<X>::operator()(const X& x) const { return hash<int>()(x.id); } // works for MS VC10, but not for g++
// or
// hash<X>::operator()(X x) const { return hash<int>()(x.id); } // works for g++ 4.7, but not for VC10
}
C ++ 11에 대한 컴파일러 지원이 아직 실험적이라는 점을 감안할 때 --- 나는 Clang을 시도하지 않았습니다 ----, 내 질문은 다음과 같습니다.
이러한 전문화를 네임 스페이스에 추가하는 것이 합법적
std
입니까? 나는 그것에 대해 복잡한 감정을 가지고 있습니다.어떤
std::hash<X>::operator()
버전이있는 경우 C ++ 11 표준을 준수합니까?휴대용 방법이 있습니까?
operator==(const Key, const Key)