STL은 C++에서 지원하는 모든 기본 데이터 타입에 대한 해시 함수를 제공합니다. 따라서 앞서 언급했던 컨테이너에서 사용자 정의 클래스 또는 구조체를 키 타입으로 사용하려면 std 네임스페이스 안에서 해시 함수를 구현해야 합니다. 또는 컨테이너의 템플릿 매개변수로 해시 함수 객체를 지정할 수도 있습니다. 그러나 해시 함수를 직접 만드는 것은 그다지 좋은 생각이 아닙니다. 해시 함수를 어떻게 만드느냐가 성능에 큰 영향을 주기 때문입니다. 해시 함수를 잘 설계하려면 수학적 지식과 직면한 문제에 대한 상당한 연구와 이해가 필요합니다. 그러므로 해시 함수 설계는 이 책에서 다루지 않습니다. 다만 Boost 라이브러리에서 제공하는 hash_combine() 함수를 사용하여 원하는 해시 함수를 구성할 수 있습니다. 다음 예제를 참고하세요.
#include <boost/functional/hash.hpp>
struct Car
{
std::string model;
std::string brand;
int buildYear;
};
struct CarHasher
{
std::size_t operator()(const Car& car) const
{
std::size_t seed = 0;
boost::hash_combine(seed, car.model);
boost::hash_combine(seed, car.brand);
return seed;
}
};
struct CarComparator
{
bool operator()(const Car& car1, const Car& car2) const
{
return (car1.model == car2.model) && (car1.brand == car2.brand);
}
};
// 사용자 정의 구조체를 사용하는 unordered_set과 unordered_map 객체 생성하기
std::unordered_set<Car, CarHasher, CarComparator> carSet;
std::unordered_map<Car, std::string, CarHasher, CarComparator> carDescriptionMap;