>백엔드 개발 >C++ >C에서 사용자 정의 유형에 대해 `std::hash::operator()`를 어떻게 전문화할 수 있습니까?

C에서 사용자 정의 유형에 대해 `std::hash::operator()`를 어떻게 전문화할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-30 00:35:14419검색

How Can I Specialize `std::hash::operator()` for Custom Types in C  ?

사용자 정의 유형에 대한 std::hash::operator() 전문화

사용자 정의 유형으로 정렬되지 않은 컨테이너를 활용하려면 std::unordered_set와 같은 키 유형 및 std::unordered_map의 경우 일반적으로 연산자==(Key, Key) 및 해시 펑터를 정의해야 합니다. 그러나 내장 유형의 경우처럼 이러한 유형에는 기본 해시 함수를 활용하는 것이 더 나을 수 있습니다.

C 표준을 포함한 다양한 리소스를 조사한 결과 다음이 가능하다는 것이 분명해졌습니다. 사용자 정의 유형에 대해 std::hash::operator()를 전문화합니다. 다음 코드 조각은 이러한 전문화의 예를 보여줍니다.

namespace std {
  template <>
  inline size_t hash<X>::operator()(const X& x) const {
    return hash<int>()(x.id);
  }
}

이제 제기된 질문을 해결해 보겠습니다.

1. 전문화의 적법성

std 네임스페이스에 전문화를 추가하는 것은 허용될 뿐만 아니라 권장됩니다. 사용자 정의 유형을 지원하기 위해 표준 기능을 확장할 수 있습니다.

2. std::hash::operator()

std::hash::operator()를 특수화하기 위한 올바른 구문은 다음과 같습니다.

namespace std {
  template <>
  struct hash<X> {
    size_t operator()(const X& x) const {
      // Your custom hash function implementation
    }
  };
}

3. 이식 가능한 솔루션

앞서 설명한 std::hash 전문화에는 C 11 호환성이 필요하며 이는 컴파일러에서 보편적으로 지원되지 않을 수 있습니다. 이식성을 높이려면 비표준 네임스페이스 사용을 고려하세요(예:

namespace ht {
  template <>
  struct hash<X> {
    // Your custom hash function implementation
  };
}
).

위 내용은 C에서 사용자 정의 유형에 대해 `std::hash::operator()`를 어떻게 전문화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.