넘치게 채우기

[C++] unordered_map(or set)의 key로 기본 자료형이 아닌 다른 자료형 사용하기(vector, pair 등) 본문

PS/언어별 스킬모음

[C++] unordered_map(or set)의 key로 기본 자료형이 아닌 다른 자료형 사용하기(vector, pair 등)

riveroverflow 2023. 9. 8. 17:36
728x90
반응형

https://stackoverflow.com/questions/62869571/call-to-implicitly-deleted-default-constructor-of-unordered-set-vectorint

 

Call to implicitly-deleted default constructor of 'unordered_set< vector<int> >'

It seems like when I try to define an unordered_set of vector, I get an error saying: "Call to implicitly-deleted default constructor of unordered_set< vector<int> > ." This d...

stackoverflow.com

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
반응형