순서가 지정되지 않은 컬렉션의 튜플에 대한 일반 해시 함수
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!