2013-03-11 1 views
8

이 같은 사이트가있다 클래스 템플릿. 그러나 예는 없으며, 가능하다면이 기능을 사용할 수 없었습니다. 휴무 예 :함수 포인터 :: unordered_map도

bool unordered_eq(const char* const s1, const char* const s2) 
{ 
    return !std::strcmp(s1, s2); 
} 

std::size_t unordered_hash(char const* s) 
{ 
    return std::hash<std::string>()(s); 
} 

std::unordered_map<char const*, std::string, 
    unordered_hash, unordered_eq> hashmap; 
+1

문자열을 키로 사용하려면 'std :: string'을 사용하지 않는 이유는 무엇입니까? 문자열 리터럴에서도 작동합니다. –

+0

예를 들어, 'Key'는 무엇이든 될 수 있습니다. 어쨌든'decltype (& unordered_hash)'와'decltype (& unordered_eq)'를'Hash'와'Pred'로 사용할 수 있습니다. 사이트가 맞습니다. – user1095108

답변

10

, 하나의 클래스 대신

없음의 함수 포인터를 제공 할 수 있습니다, 그것은 오해입니다. 함수 개체 대신 생성자 대신 함수 포인터를 제공 할 수 있습니다. 템플릿 매개 변수는 여전히 유형입니다.이 경우 함수 포인터의 유형입니다. 따라서, 작성해야합니다

typedef unordered_map< 
      char const*, string, 
      size_t(*)(char const*), // type for hashing 
      bool(*)(char const*, char const*) // type for equality 
     > yourmaptype; 

yourmaptype hm (
     4, // minimum number of buckets 
     &unordered_hash, // function address for hashing 
     &unordered_eq, // function address for equality 
    ); 

표준 라이브러리는 첫 번째 매개 변수의 기본값을 정의하지만이 기본값은 표준화되지 않았습니다. n에 대한 공급 업체별 기본값을 유지하는 방법이없고 동시에 Functor의 값을 설정하는 방법이있는 것 같습니다. 제 4의 사용은 다소 임의적입니다.

기본 구성 가능한 함수 객체를 대신 사용해야합니다. 이 옵션을 사용하면 최소화 버켓 크기를 지정하지 않고도 빠져 나올 수있을뿐만 아니라 펑터가 인 컴파일러에서 인라인하기가 더 쉽기 때문에 잠재적으로 더 빠를 것입니다.

+0

단지 레코드 용으로,'gcc'는'n'에 디폴트 값'10'을 사용합니다. – user1095108