2012-07-07 6 views
2

unordered_map 컨테이너의 키로 std :: pair 쌍을 사용하려고하지만 사용자 정의 해시 함수를 정의하는 데 어려움이 있습니다.unordered_map 키로 사용되는 enum 값 쌍의 사용자 정의 해시 함수

//enum and pair declaration 
enum ShapeType{PLANE, BOX, SPHERE}; 
typedef std::pair<ShapeType,ShapeType> ShapePair; 

//unordered_map declaration 
typedef void(*CollisionMethod)(const Shape*, const Shape*, CollisionData*); 
typedef std::unordered_map<ShapePair, CollisionMethod,ShapePairHash> CollisionMethodsTable; 

내가 제대로 ShapePairHash 펑터를 정의하는 방법을 이해하지 않습니다

나는 다음 시도했다.

struct ShapePairHash 
{ 
    std::size_t operator()(const ShapePair &pair) 
    { 
     return std::hash<std::size_t>()(pair.first)^std::hash<std::size_t>()(pair.second); 
    } 
}; 

하지만 난 VS 컴파일러에 오류 C3840 (expression having type 'type' would lose some const-volatile qualifiers in order to call 'function')를 얻을 : 나는 다음 시도했다.

누구나 unordered_map과 함께 사용할 사용자 정의 해시 함수를 선언하는 올바른 방법을 제안 할 수 있습니까?

+1

을 당신은 단지 펑터 함수를 호출하여 변경하도록 지정하기 위해 함수 정의에 뒤에 const를 누락하지 있습니까? –

+0

예, 문제를 일으키는 const 지정자가 누락 된 것 같습니다. – Heisenbug

답변

3

마지막 열거 형 값을 정의한 다음이를 사용하여 해시 (실제로는 완벽한 해시)를 생성 할 수 있습니다. (열거 형 값의 수를 N이라고 가정) 있도록이 가능 열거 값의 수가 충분히 낮은 것으로 가정합니다 : N * N + N < MAX_UINT

enum class ShapeType : unsigned int { PLANE=0, BOX=1, SPHERE=2, LAST=3 }; 

struct ShapePairHash 
{ 
    std::size_t operator()(const ShapePair &pair) const 
    { 
     return static_cast<std::size_t>(pair.first) 
      * static_cast<std::size_t>(ShapeType::LAST) 
      + static_cast<std::size_t>(pair.second) 
    } 
}; 

또한, 당신의 컴파일 문제에 대한 그냥 함수를 선언 할 필요가 const.

2

귀하의 연산자() 메소드는 const를해야한다 :

std::size_t operator()(const ShapePair &pair) const 
관련 문제