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

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

Mary-Kate Olsen
풀어 주다: 2024-12-10 03:19:16
원래의
137명이 탐색했습니다.

How Can I Specialize `std::hash` for My User-Defined Types in C  ?

순서가 지정되지 않은 컨테이너의 사용자 정의 유형에 대한 std::hash 전문화

std::unordered_set에서 사용자 정의 키 유형 사용을 활성화하려면 및 std::unordered_map의 경우 항등 연산자와 해시 함수를 모두 제공해야 합니다. 여기에는 일반적으로 이러한 연산자를 구현하는 사용자 정의 구조체 또는 클래스를 정의하는 작업이 포함됩니다. 다만, 컴파일러나 라이브러리에서 제공하는 내장형과 유사하게 사용자 정의형에 대해서는 기본 해시함수를 사용하는 것이 더 편리할 것입니다.

C Standard Draft N3242 및 Boost.Unordered에 따르면 , 사용자 정의 유형에 대해 std::hash를 특수화하는 것이 가능합니다. 여기에는 std 네임스페이스에 특수화를 추가하는 작업이 포함됩니다.

namespace std {
  template <>
  inline size_t hash<X>::operator()(const X& x) const { return hash<int>()(x.id); }
}
로그인 후 복사

이 예에서 X 유형의 해시 함수는 X에 멤버 변수 ID가 있다고 가정하는 int 유형의 해시 함수를 사용하도록 특수화되었습니다. 해시 함수는 특정 템플릿 인수 유형에 맞게 특화되어야 하며 결과 해시 값은 해당 유형에 대한 등호 연산자와 일치해야 한다는 점에 유의하는 것이 중요합니다.

합법성 및 이식성:

  • 성병에 전문화를 추가하는 것이 합법적인가요? 예, 관련된 유형 중 하나가 사용자 정의되는 한 std에 전문화를 추가하는 것은 합법적입니다.
  • 어떤 버전의 std::hash::operator()가 C 11과 호환됩니까? C 11에서 std::hash를 특수화하는 올바른 방법은 구조체 std::hash:
namespace std {
  template <> struct hash<X> {
    size_t operator()(const X& x) const { return hash<int>()(x.id); }
  };
}
로그인 후 복사
  • 의 특수화를 정의하는 것입니다. 이식 가능한 방법이 있나요? 위에 제공된 코드는 C 11을 지원하는 다양한 컴파일러에서 이식 가능해야 합니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿