std::set<>
和std::map<>
都可以使用std::pair
作爲關鍵,但爲什麼不能std::unordered_set<>
和std::unordered_map<>
?爲什麼我不能使用pair作爲unordered_set/unordered_map的關鍵字?
例如:
unordered_set<pair<int,int> > S;
S.insert(make_pair(0, 1));
不能編譯。
std::set<>
和std::map<>
都可以使用std::pair
作爲關鍵,但爲什麼不能std::unordered_set<>
和std::unordered_map<>
?爲什麼我不能使用pair作爲unordered_set/unordered_map的關鍵字?
例如:
unordered_set<pair<int,int> > S;
S.insert(make_pair(0, 1));
不能編譯。
unordered_*
容器需要散列函數。默認情況下,它們使用std::hash
,但是在標準庫中提供的std::pair<T1,T2>
沒有專門的std::hash
。另一方面,訂購的集裝箱依賴於std::less
(默認)和std::pair
確實有operator<
提供。這就是爲什麼它正常工作。
爲了有一個pair
一個無序的容器,你必須提供一個散列函數對象自己。例如:?
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));
您需要爲配對提供散列函數。
會S.emplace(...也行,如果沒有,你會改變什麼 – HeinrichStack
@Barry可以p.first^p.second得到不同對像P_A相同的值, P_B? – olivia
@olivia當然,這肯定會給你的'相同的值(A,b)'和'(b,A)',它並非是一個完美的哈希函數,只是一個簡單的例子。 – Barry