2013-11-26 3 views
0

unordered_set을 사용하여 해시 테이블을 구현하고 있습니다. 찾기 기능을 사용하는 방법을 알아낼 수 없습니다. 이 코드를 실행할 때 계속 seg 오류가 발생합니다. find()가 요소를 찾지 못했기 때문에 find()가 그것을 알아야하기 때문에 나는 그것을 안다. 내 질문은 내가 제대로 제공 한 사용자 지정 해시 함수를 사용하여 찾을 수 있습니까?unordered_set의 해시 함수

unordered_set<Play*, Play::Hash> hashedData 
unordered_set<Play*>::iterator got; 

for (int i = 0; i < 10; ++i) { 
    got = hashedData.find(data[i]); 

    cout << (*got)->getSummary() << endl << endl; 
} 

데이터는 단지

vector<Play*> 

내 해시 함수가 unordered_set 세 번째 인수로 자신의 Pred를 가산의 평가를 추가하는이

struct Hash { 
    size_t operator()(Play* const &x) const { 
     size_t t = 0; 
     static int hash = 0; 

     string u = x->getOffense(); 
     string v = x->getDefence(); 
     string w = x->getPlayDesc(); 

     t = u.length() + v.length() + w.length(); 
     t += hash; 
     ++hash; 

     return t; 
    } 
}; 

답변

1

필자는 왜 요소를 찾을 수 없는지 근본 원인을 알고 있습니다.

당신은 Hash의 staic variale를 사용합니까?

변경 당신은 Hash 기능이 좋아합니다 : 같은 객체 A 호출이이 기능을 두 번, 결과가 다른 경우

struct Hash 
{ 
    size_t operator()(Play* const &x) const 
    { 
     size_t t = 0; 
     string u = x->getOffense(); 
     string v = x->getDefence(); 
     string w = x->getPlayDesc(); 

     t = u.length() + v.length() + w.length(); 
     return t; 
    } 
}; 

이 기능은, 문제가 있습니다. 왜냐하면 정적 변수 static int hash = 0;을 사용하기 때문입니다. 따라서 hashedData을 구성 할 때 Hash 함수를 호출하면 find 함수를 사용할 때 동일한 객체 호출 Hash이 다시 발생하지만 다른 결과가 발생하므로 funtiocn findhashedData.end()으로 반환됩니다.

cout << (*got)->getSummary() << endl << endl;으로 전화하면 오류가 발생합니다. 다음과 같이해야합니다.

for (int i = 0; i < 10; ++i) 
{ 
    got = hashedData.find(data[i]); 
    if (got != hashedData.end()) 
    { 
     cout<<(*got)->getSummary()<<endl; 
    } 
} 
0

시도처럼 보인다. 그런 다음 비교되는 두 개의 인수를 검사 할 수 있습니다. 또한 find 호출 후 iterator가 end()와 같지 않은지 확인하십시오.