이번 튜토리얼에서는 C++에서 pair(쌍)를 키로 사용하는 unordered_map을 생성하는 방법에 대해 알아보겠습니다.
C++의 unordered_map은 기본적으로 pair 타입에 대한 해시 함수(hash function)를 제공하지 않습니다. 따라서 특정 pair에 대한 해시 값을 사용하려면, 사용자가 직접 해시 함수를 정의하여 명시적으로 전달해 주어야 합니다.
아래 예제에서는 두 개의 정수를 묶은 pair를 키로 사용하는 unordered_map을 만들기 위해, 커스텀 해시 구조체인 hash_pair를 정의하고 이를 맵 선언 시 세 번째 템플릿 인자로 전달하는 방식을 보여줍니다.
예제 코드
#include <bits/stdc++.h>
using namespace std;
// 임의의 pair에 대한 해시를 수행하는 구조체
struct hash_pair {
template <class T1, class T2>
size_t operator()(const pair<T1, T2>& p) const {
auto hash1 = hash<T1>{}(p.first);
auto hash2 = hash<T2>{}(p.second);
return hash1 ^ hash2; // 두 해시 값을 결합
}
};
int main() {
// 커스텀 해시 함수를 명시적으로 전달
unordered_map<pair<int, int>, bool, hash_pair> um;
// 키로 사용할 pair 생성
pair<int, int> p1(1000, 2000);
pair<int, int> p2(2000, 3000);
pair<int, int> p3(2005, 3005);
um[p1] = true;
um[p2] = false;
um[p3] = true;
cout << "Contents of the unordered_map : \n";
for (auto p : um)
cout << "[" << (p.first).first << ", " << (p.first).second << "] ==> " << p.second << "\n";
return 0;
}실행 결과
Contents of the unordered_map : [1000, 2000] ==> 1 [2005, 3005] ==> 1 [2000, 3000] ==> 0
코드 설명
hash_pair 구조체: operator()를 오버로딩하여 pair의 첫 번째 요소와 두 번째 요소 각각에 대해 std::hash를 적용한 뒤, XOR(^) 연산으로 두 해시 값을 결합합니다. 이렇게 만들어진 값이 해당 pair의 최종 해시 값이 됩니다.
unordered_map 선언: unordered_map<pair<int, int>, bool, hash_pair>처럼 세 번째 템플릿 인자에 커스텀 해시 함수를 지정함으로써, pair를 키로 사용할 수 있게 됩니다.
이후에는 일반적인 unordered_map과 동일하게 대괄호 연산자([])를 통해 값을 삽입하거나 조회할 수 있으며, 범위 기반 for문을 이용해 모든 요소를 순회하며 출력할 수 있습니다.