C++ unordered_map自定義key

前言

今天刷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ù),意在解決沖突。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容