2012-02-07 3 views
0
class CTime 
{ 
public:  
    CTime(){} 

    class valueComp 
    { 
    public: 
     bool operator()(const tm &A,const tm &B) const { 
      if ((A.tm_mday < B.tm_mday) && (A.tm_mon< B.tm_mon)&& (A.tm_year < B.tm_year) &&  
       (A.tm_hour< B.tm_hour)&& (A.tm_min< B.tm_min) && (A.tm_sec< B.tm_sec)) 

       return true; 

      return false; 
     } 
    }; 

    time_t MakeTime(struct tm *trf) { 
     if(HashTime.size()>86400) 
      HashTime.clear(); 

     it =HashTime.find(*trf); 
     if(it == HashTime.end()) 
     { m_tDateSeconds= mktime (trf);  
      cout<<"mktime calculated"<<endl;  
      HashTime[*trf]= m_tDateSeconds;  
      return m_tDateSeconds;              
     } 
     else 
     {  cout<<"retrieving from map"; 
      HashTime.find(*trf) ; 
     }} 
private: 
    std::tr1::unordered_map<struct tm,long int,valueComp> HashTime; 
    std::tr1::unordered_map<struct tm,long int,valueComp>::iterator it; 
    time_t   m_tDateSeconds; 
}; 

int main() 
{return 0; 
} 

이것은 정렬되지 않은지도가 나를 위해 작동하는지 여부를 확인하기 위해 inorder를 코딩 한 것입니다.unordered_map 사용

코드에 오류가있는 경우 초보자로서 알려주십시오.

+0

그러나이 작품 : 사용법 #include 사용법 #include 사용법 #include 형식 정의 표준 : TR1 :: unordered_map도 <표준 : : 문자열, INT> AgeTable; int main() { AgeTable 연령; ages.insert (std :: make_pair ("Joe", 25)); ages.insert (std :: make_pair ("Sally", 18)); ages.insert (std :: make_pair ("Billy", 11)); AgeTable :: iterator iter; 위한 (ITER ages.begin =()! = ages.end ITER(); ITER ++) { 표준 : << iter-> 제 << "는"<< iter->초 << 표준 : ENDL COUT; } –

+0

** ** 질문에 ** 수정하십시오. 댓글 섹션에서는 꽤 읽을 수 없습니다. 또한 게시물의 코드 형식을 올바르게 지정하는 방법을 알아 보려면 [편집 도움] (http://stackoverflow.com/editing-help)을 참조하십시오. 나는 당신이 전에 게시 한 것을 형식화하기위한 노력을 이미했습니다. –

+0

왜 처음에는 정렬되지 않은지도를 사용하고 있습니까? 그것이하고있는 일과 그것이 보통의 (정렬 된)지도와 다른 점을 당신은 알고 있습니까? 당신의 코드는 당신처럼 보이지 않습니다. –

답변

0

unordered_map은 해시 테이블이므로 평등성 테스트뿐 아니라 해시 함수를 제공해야합니다. 표준 라이브러리는 내장 유형과 std::string과 같은 몇 가지 다른 유형의 해시 함수를 제공하지만 unordered_map<std::string,int>의 경우에 사용되지만 struct tm에 대한 해시 함수는 없으므로 하나를 작성해야합니다. 세 번째 템플릿 매개 변수로 제공해야합니다. 즉, 균등 테스트가 네 번째 매개 변수이므로 unordered_map<struct tm,long,myHash,valueComp>이 필요합니다.

해시 함수는 함수 호출 연산자가 키 타입의 값을 취하고 size_t가 반환하는 호출 개체 형식이어야합니다 :

struct myHash{ 
    size_t operator()(struct tm const&); 
}; 

그냥 사용하는 아마 쉽게를 std::map<struct tm,long,compareTm> (그리고 쓰기 주문 비교 compareTm)를 사용하는 대신에 좋은 해시 함수를 제안합니다.

+0

귀하의지도 주셔서 감사합니다 많이 내 경우에는 우리가 구조로 키를 전달하는 경우 unordered_map 도움이 될 것이라고 생각합니까? –

+0

구조체를'map' 또는'unordered_map'에서 키로서 사용할 수 있습니다. 'map '에 대한 순서 비교 인'unordered_map '에 대해 해시 및 동등성과 같은 적절한 지원 함수를 작성하면됩니다. 'unordered_map'은 has 함수가 잘 맞고 빠르면 더 빨리 찾을 수 있습니다. 해시 함수가 느리거나 가난한 경우'unordered_map '은'map'보다 훨씬 느릴 수 있습니다. –

관련 문제