2016-10-18 3 views
1

나는 그런 순서가없는지도를 가지고 :정렬되지 않은지도에서 값을 올바르게 얻는 방법은 무엇입니까?

static std::unordered_map<std::pair<size_t , size_t>, long> my_map; 

그럼 난 my_map에서 값을 얻으려면 :

size_t size1 = 1; 
size_t size2 = 2; 
auto x = make_pair(size1, size2); 
auto &result = my_map[x]; 

하지만 오류가 있습니다

error: no match for ‘operator[]’ (operand types are ‘std::unordered_map<std::pair<long unsigned int, long unsigned int>, long int>’ and ‘std::pair<long unsigned int, long unsigned int>’) 
    auto &result = my_map[x]; 

내가 그것을 어떻게 극복 할 수 있습니까? 해시 함수를 사용하여

+0

사용하십시오'표준 : :지도'또는'표준 : unordered_map' –

+2

@ πάνταῥεῖ 흠, 나는'정적 표준을 사용하여 내 예에 :: unordered_map도 < std :: pair , long>' – kotokbek

+3

@ πάνταῥε any 어쨌든 작동하지 않아야합니까? – krzaq

답변

0

here에서 :

#include <unordered_map> 
#include <utility> 
#include <map> 
#include <functional> 
#include <string> 

// Only for pairs of std::hash-able types for simplicity. 
// You can of course template this struct to allow other hash functions 
struct pair_hash { 
    template <class T1, class T2> 
    std::size_t operator() (const std::pair<T1, T2> &p) const { 
     auto h1 = std::hash<T1>{}(p.first); 
     auto h2 = std::hash<T2>{}(p.second); 

     // Mainly for demonstration purposes, i.e. works but is overly simple 
     // In the real world, use sth. like boost.hash_combine 
     return h1^h2; 
    } 
}; 

int main() 
{ 
    //static std::unordered_map<std::pair<size_t, size_t>, long> my_map; 
    static std::unordered_map<std::pair<size_t, size_t>, long, pair_hash> my_map; 

    size_t size1 = 1; 
    size_t size2 = 2; 
    auto x = std::make_pair(size1, size2); 
    auto &result = my_map[x]; 

    return 0; 

} 
관련 문제