2015-05-24 17 views

cevap

16

unordered_* kapsayıcıların bir karma işlevine ihtiyaçları vardır. Varsayılan olarak, std::hash kullanıyorlar, ancak standart kitaplıkta sağlanan std::pair<T1,T2> için std::hash özelleştirme yok. Öte yandan, siparişi konteynırları std::less (varsayılan olarak) ve std::pair'un operator< ürününe sahiptir. Bu yüzden işe yarıyor.

pair ile sırasız bir konteynere sahip olmak için, kendiniz bir hash functor sağlamanız gerekecektir. Örneğin:?

struct SimpleHash { 
    size_t operator()(const std::pair<int, int>& p) const { 
     return p.first^p.second; 
    } 
}; 

std::unordered_set<std::pair<int, int>, SimpleHash> S; 
S.insert(std::make_pair(0, 1)); 
+0

S.emplace (... da çalışmaya devam eder ve eğer değil, ne değişirdi – HeinrichStack

+1

@Barry p.first olabilir^p.second p_a gibi farklı çiftleri için aynı değeri elde ve p_b? – olivia

+1

@olivia Elbette, (a, b) 've' (b, a) 'için kesinlikle aynı değeri verir. Mükemmel bir karma işlevi değil, sadece basit bir örnek olması amaçlanmıştır. – Barry

0

Eşleşme için bir karma işlevi sağlamanız gerekir.