2016-11-24 5 views
3

다른 unordered_map을 키 (사용자 정의 해시 함수)와 함께 사용하려는 unordered_map을 사용하려고합니다. 아마 사용자 정의 동등 함수를 추가했는데 아마도 필요하지는 않습니다.C++ unordered_map 여기서 key는 unordered_map입니다.

코드가 예상 한대로 작동하지 않지만 진행중인 작업의 머리 나 꼬리를 만들 수 없습니다. 어떤 이유로, find()를 수행 할 때 equal 함수가 호출되지 않습니다. 이것은 기대했던 것입니다. ==하여 두 개체 std::unordered_map 비교

unsigned long hashing_func(const unordered_map<char,int>& m) { 
    string str; 
    for (auto& e : m) 
     str += e.first; 
    return hash<string>()(str); 
} 
bool equal_func(const unordered_map<char,int>& m1, const unordered_map<char,int>& m2) { 
    return m1 == m2; 
} 

int main() { 

    unordered_map< 
     unordered_map<char,int>, 
     string, 
     function<unsigned long(const unordered_map<char,int>&)>, 
     function<bool(const unordered_map<char,int>&, const unordered_map<char,int>&)> 
     > mapResults(10, hashing_func, equal_func); 

    unordered_map<char,int> t1 = getMap(str1); 
    unordered_map<char,int> t2 = getMap(str2); 

    cout<<(t1 == t2)<<endl; // returns TRUE 
    mapResults[t1] = "asd"; 
    cout<<(mapResults.find(t2) != mapResults.end()); // returns FALSE 

    return 0; 
} 
+1

해시 함수가 두 맵에 대해 반환하는 값을 확인하십시오. – Caleth

답변

2

먼저, 항등 연산자가 확실히 필요합니다, 당신이 그것을 유지해야하므로. 당신의 순서가 맵의 해시 함수에서

살펴 보자는 :

string str; 
for (auto& e : m) 
    str += e.first; 
return hash<string>()(str); 

가 정렬되지 않은지도입니다 때문에, 정의에 의해, 반복자는 임의의 순서로 정렬되지 않은지도의 키를 반복 할 수 있습니다. 그러나 해시 함수는 동일한 키에 대해 동일한 해시 값을 생성해야하므로이 해시 함수는 분명히 실패합니다.

또한 해시 함수에는 키 자체 외에도 순서가 지정되지 않은지도 키의 값이 포함될 것으로 예상됩니다. 이 방법을 원할지도 모릅니다. 두 개의 정렬되지 않은지도는 키가 동일하고 값이 무시되는 한 동일한 키로 간주됩니다. 그것은 당신의 기대가 무엇인지에 대한 질문에서 분명하지 않지만, 당신은 그것을 생각하고 싶어 할 것입니다.

+0

네, 문제였습니다. 해시 함수가 동일한 키에 대해 동일한 값을 반환하지 않았습니다. 그것은 어떻게 든 내 마음을 벗어났다. –

2

은 맵이 동일한 키를 포함하고 있는지 여부를 비교한다. 그것들이 동일한 순서로 포함되어 있는지를 알려주는 것은 아무것도하지 않습니다 (결국 정렬되지 않은지도입니다). 그러나 hashing_func은지도의 항목 순서에 따라 달라집니다. hash<string>()("ab")은 일반적으로 hash<string>()("ba")과 다릅니다.

0

시작하기 좋은 곳은 각지도에 대해 hashing_func가 반환하는 것 또는 더 쉽게 hashing_func에서 생성되는 문자열 구성입니다. 이러한 유형의

더 분명 올바른 해시 함수가 될 수있다 : 모든

unsigned long hashing_func(const unordered_map<char,int>& m) { 
    unsigned long res = 0; 
    for (auto& e : m) 
     res^hash<char>()(e.first)^hash<int>()(e.second); 
    return res; 
} 
관련 문제