前言
今天刷Leetcode的時(shí)候,使用了pair<>作為unordered_map的key,編譯時(shí)報(bào)錯(cuò)。
解決
如果沒(méi)有特殊的需要,可以使用map來(lái)代替unordered_map,這樣可以通過(guò)編譯
原因
map是有序的,底層使用的紅黑樹(shù),map需要對(duì)key進(jìn)行相互比較,從而確定具體插入的位置,所以map的key值需要支持比較函數(shù)。而pair重載了相對(duì)應(yīng)的比較操作符,所以使用map沒(méi)有問(wèn)題
相反,unordered_map是無(wú)序的,是基于哈希表的數(shù)據(jù)結(jié)構(gòu),unordered_map需要對(duì)key進(jìn)行hash函數(shù),利用hash出的唯一值確定插入對(duì)象的位置,所以u(píng)nordered_map的key值需要支持hash函數(shù),而pair沒(méi)有默認(rèn)的hash函數(shù),所以會(huì)編譯出錯(cuò)
當(dāng)然,我們也可以自定義pair類型的hash函數(shù),即重載operator(),返回一個(gè)size_t類型,從而使得unordered_map支持用pair<>做為key值
struct pair_hash
{
template<typename T1, typename T2>
std::size_t operator() (const std::pair<T1, T2>& p) const {
return std::hash<T1>{}(p.first) ^ std::hash<T2>{}(p.second);
}
};
struct pair_equal
{
template<typename T1, typename T2>
bool operator() (const std::pair<T1, T2>& a, const std::pair<T1, T2>& b) const {
return a.first == b.first && a.second == b.second;
}
};
int main()
{
unordered_map<pair<int, int>, int, pair_hash, pair_equal> m;
return 0;
}
為了更加合理,我們還需要添加一個(gè)判斷pair是否相等的函數(shù),意在解決沖突。