2015-05-24 9 views

Odpowiedz

16

Kontenery unordered_* wymagają funkcji mieszania. Domyślnie używają one std::hash, ale nie ma specjalizacji std::hash dla std::pair<T1,T2> dostarczonej w bibliotece standardowej. Z drugiej strony, kontenery zamówione opierają się na std::less (domyślnie) i std::pairma mają operator< dostarczone. Właśnie dlatego po prostu działa.

Aby mieć nieuporządkowany pojemnik z pair, musisz sam zapewnić sobie funkcję mieszającą. Na przykład:?

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

byłoby S.emplace (... również pracować, a jeśli nie, to co byś zmienił – HeinrichStack

+1

@Barry może p.first^p.second uzyskać taką samą wartość dla różnych par jak i p_a p_b? – olivia

+1

@olivia Oczywiście, to na pewno da ci tę samą wartość dla '(a, b)' i '(b, a)'. Nie ma to być idealna funkcja skrótu, tylko prosty przykład. – Barry

0

Musisz podać funkcję skrótu dla pary.

Powiązane problemy