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::pair
ma 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));
byłoby S.emplace (... również pracować, a jeśli nie, to co byś zmienił – HeinrichStack
@Barry może p.first^p.second uzyskać taką samą wartość dla różnych par jak i p_a p_b? – olivia
@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