이 std::unordered_set<Key>
및 std::unordered_map<Key, Value>
하나의 사용자 정의 키 유형을 지원하는 것은 operator==(Key, Key)
를 제공해야하고 해시 펑 : 유형 X
에 대한 기본 해시와 단지 std::unordered_set<X>
를 작성하는 것이 더 편리 할 것std :: hash를 특수화하는 방법 <Key> :: unorder 컨테이너의 사용자 정의 유형에 대한 operator()?
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;
, 컴파일러 및 라이브러리와 함께 오는 유형의 경우는 입니다. 상담 후
- C++ 표준 Draft N3242 §20.8.12 [unord.hash] 및 §17.6.3.4 [hash.requirements,
- Boost.Unordered
- 그램 ++
include\c++\4.7.0\bits\functional_hash.h
- VC10
include\xfunctional
- 에게 다양한 related question (스택 오버플로)
it se 가능한 EMS는 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)는 아직 실험 단계에 대한 감안할 때 컴파일러 지원 --- 내가 연타를 시도하지 않았다 ---이 내 질문은 :
그것을인가 그러한 전문화를 네임 스페이스
std
에 추가하는 것은 합법적입니까? 나는 그것에 대해 혼합 된 감정을 가지고있다.std::hash<X>::operator()
버전 중 어느 것이 C++ 11 표준을 준수합니까?휴대 할 수있는 방법이 있습니까?
을, 나는 글로벌'연산자 == (CONST 키, CONST 키)를 제공했다 ' –