2017-12-27 10 views
1

나는 내 자신의 구조를 위해 새로운 해시 함수를 작성하려고합니다. 문제는 여기 온다사용자 정의 구조에서 정의 된 정렬되지 않은 세트에 대해 사용자 정의 해시 함수를 작성하는 방법은 무엇입니까?

struct peopleHash{ 
    size_t operator()(const people& p) const{ 
     return p.id; 
    } 
} 

: 그리고 여기 내 코드입니다 :

struct people{ 
    int id; 
    unordered_set<people>friends; 
    people(int x) : id(x) {} 
}; 

그리고 내가 좋아하는, 친구에 대한 해시 함수를 필요로 내가 먼저 사람들을 초기화 할 경우 peopleHash 기능이 정의되지 않은 "찾아 낼 것입니다 사람을 입력하십시오. " peopleHash를 먼저 초기화하면 같은 일이 발생합니다. 내가 좋아하는, 사람들의 구조체 내부에 peopleHash을 정의하려고 :

struct people{ 
    int id; 
    struct peopleHash{ 
     size_t operator()(const people& p) const{ 
      return p.id; 
     } 
    }; 
    unordered_set<people, peopleHash>friends; 
    people(int x) : id(x) {} 
}; 

그러나 컴파일러는 말했다 :

error: invalid operands to binary expression ('const people' and 'const people') 
     {return __x == __y;} 

나는 아무 생각이 어떻게 처리하지해야 ... 어떤 도움을?

+1

'people :: operator =='을 구현하십시오. 두 인스턴스가 동일한 해시 값을 갖는다면, 그것들은 동일성을 위해 비교 될 것입니다. – Praetorian

+1

해싱 문제 이외의 다른 문제가 있습니다. 정렬되지 않은 컨테이너의 클래스는 또한'=='연산자를 구현해야하며 컨테이너의 클래스는 완전한 유형이어야하며'people'의 정의가 완료 될 때까지는 발생할 수 없습니다. 이는 순방향 선언으로 그 자체만으로 해결되는 순환 의존 문제 이상입니다. –

+0

@Praetorian 답장을 보내 주셔서 감사합니다! 나는 운영자 ==를 추가,하지만 오류가 말한다 : 오버로드 '연산자는 =='이진 연산자 (3 개 매개 변수가 있습니다) ... 이해가 안 ... 부울 연산자 == (CONST 명 및 X, CONST를해야합니다 사람 & y) { return x.id == y.id; } –

답변

1

당신은 할 수 없습니다. people은 정의되지 않은 동작 인 std::unordered_set을 인스턴스화 할 때 불완전한 유형이됩니다. http://eel.is/c++draft/library#res.on.functions을 참조하십시오.

+0

음 ...하지만 그 사람의 이드와 친구들을 묘사하는 유형이 필요합니다. 그 사람과 그의 친구들이 공통의 친구가 있는지 확인해야합니다. 집합 대신 벡터를 사용할 경우, 전체 벡터를 탐색하여 교차로를 찾아야 할 때마다 매우 시간이 많이 걸릴 것입니다.이 문제에 대해 더 좋은 해결책이 있습니까? –