Notice
250x250
Recent Posts
Recent Comments
Link
넘치게 채우기
[C++] unordered_map(or set)의 key로 기본 자료형이 아닌 다른 자료형 사용하기(vector, pair 등) 본문
PS/언어별 스킬모음
[C++] unordered_map(or set)의 key로 기본 자료형이 아닌 다른 자료형 사용하기(vector, pair 등)
riveroverflow 2023. 9. 8. 17:36728x90
반응형
struct pair_hash {
template <class T1, class T2>
size_t operator () (pair<T1, T2> const &v) const {
auto h1 = hash<T1>{}(v.first);
auto h2 = hash<T2>{}(v.second);
return h1 ^ h2;
}
};
int main(void) {
unordered_map<pair<int, int>, int, pair_hash> costs;
}
기본적으로 unordered_map이나 unordered_set의 key로는 기본적인 자료형만 받을 수 있습니다.
vector나 pair를 사용하기 위해서는 다음의 해싱 작업이 필요합니다:
예시) vector를 key로 쓰려는 경우
#include <iostream>
#include <unordered_map>
#include <vector>
// 벡터를 해싱하기 위한 사용자 정의 해시 함수
struct vector_hash {
template <typename T>
std::size_t operator()(const std::vector<T>& vec) const {
std::size_t hash = 0;
for (const T& element : vec) {
hash ^= std::hash<T>{}(element); // 각 요소의 해시를 XOR 연산하여 합칩니다.
}
return hash;
}
};
int main() {
std::unordered_map<std::vector<int>, std::string, vector_hash> myMap;
std::vector<int> key1 = {1, 2, 3};
std::vector<int> key2 = {4, 5, 6};
myMap[key1] = "Value 1";
myMap[key2] = "Value 2";
std::cout << myMap[key1] << std::endl; // "Value 1"
std::cout << myMap[key2] << std::endl; // "Value 2"
return 0;
}
예시) pair를 key로 쓰려는 경우
#include <iostream>
#include <unordered_map>
#include <utility>
// pair를 해싱하기 위한 구조체 정의
struct pair_hash {
template <class T1, class T2>
std::size_t operator () (std::pair<T1, T2> const &v) const {
auto h1 = std::hash<T1>{}(v.first);
auto h2 = std::hash<T2>{}(v.second);
return h1 ^ h2;
}
};
int main() {
// pair를 키로 사용하는 unordered_map 선언
std::unordered_map<std::pair<int, int>, int, pair_hash> costs;
// 예시 데이터 추가
costs[std::make_pair(1, 2)] = 10;
costs[std::make_pair(3, 4)] = 20;
// 값 가져오기
int cost1 = costs[std::make_pair(1, 2)];
int cost2 = costs[std::make_pair(3, 4)];
std::cout << "Cost1: " << cost1 << std::endl; // 출력: Cost1: 10
std::cout << "Cost2: " << cost2 << std::endl; // 출력: Cost2: 20
return 0;
}
728x90
반응형
'PS > 언어별 스킬모음' 카테고리의 다른 글
순열-조합(C++, Python, Java) (0) | 2023.09.16 |
---|---|
좌표평면에서 두 선분이 만나는지 알아내기 (0) | 2023.09.13 |
[C++] 람다 함수 (0) | 2023.09.06 |
[Java] 자바 코테의 기술 (0) | 2023.08.25 |
[Python] 파이썬 코테의 기술 (0) | 2023.08.24 |