> 백엔드 개발 > C++ > 정렬되지 않은 컬렉션의 튜플에 대한 일반 해시 함수를 구현하는 방법은 무엇입니까?

정렬되지 않은 컬렉션의 튜플에 대한 일반 해시 함수를 구현하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-11-15 09:21:02
원래의
498명이 탐색했습니다.

How to Implement a Generic Hash Function for Tuples in Unordered Collections?

순서가 지정되지 않은 컬렉션의 튜플에 대한 일반 해시 함수

std::unordered_map 및 std::unordered_set 컨테이너는 요소의 효율적인 조회 및 삽입을 제공합니다. 해시된 값을 기반으로 합니다. 그러나 사용자 정의 해시 함수를 정의하지 않고 튜플을 이러한 컬렉션의 키로 사용하면 예기치 않은 동작이 발생할 수 있습니다.

이를 바로잡기 위한 한 가지 접근 방식은 다음과 같이 특정 튜플 유형에 대한 해시 함수를 수동으로 정의하는 것입니다.

template<>
struct std::hash<std::tuple<int, int>> {
  size_t operator()(std::tuple<int, int> const& tuple) const { ... }
};
로그인 후 복사

이 접근 방식은 작동하지만 사용된 모든 튜플 유형에 대해 해시 함수를 정의하는 것은 지루할 수 있습니다. 이를 자동화하기 위해 다음과 같이 일반 해시 함수를 구현할 수 있습니다.

#include <tuple>

namespace std {
  namespace {

    // Code derived from Boost
    template<class T>
    inline void hash_combine(std::size_t& seed, T const& v) { ... }

    // Recursive template code from Matthieu M.
    template<class Tuple, size_t Index = std::tuple_size<Tuple>::value - 1>
    struct HashValueImpl { ... };

  }

  template<typename... TT>
  struct hash<std::tuple<TT...>> {
    size_t operator()(std::tuple<TT...> const& tuple) const { ... }
  };
}
로그인 후 복사

이 함수는 인수 종속 이름 조회(ADL)를 활용하여 컴파일러가 튜플 유형을 기반으로 올바른 해시 구현을 자동으로 선택할 수 있도록 합니다. .

Standard Conformant Solution

참고할 만한 점은 std 네임스페이스에 비표준 함수를 정의하는 것은 정의되지 않은 동작입니다. 표준 준수 솔루션의 경우 사용자 정의 네임스페이스를 생성하고 해시 함수를 정의하는 데 사용할 수 있습니다.

namespace my_hash {

  // Forward non-tuple types to the std::hash
  template<typename TT>
  struct hash { ... };

  // Provide the optimized hash for tuples
  template<typename... TT>
  struct hash<std::tuple<TT...>> { ... };

}
로그인 후 복사

이 솔루션을 사용할 때 순서가 지정되지 않은 컬렉션은 다음과 같이 사용자 정의 해시 구현을 명시적으로 참조해야 합니다.

unordered_set<
  std::tuple<double, int>,
  std::hash<std::tuple<double, int>>,
  std::equal_to<std::tuple<double, int>>
> test;  
로그인 후 복사

위 내용은 정렬되지 않은 컬렉션의 튜플에 대한 일반 해시 함수를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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