亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索

c++中如何定義一個哈希函數(shù)用于自定義類型的unordered_map_c++自定義哈希函數(shù)編寫方法

裘德小鎮(zhèn)的故事
發(fā)布: 2025-10-15 10:24:02
原創(chuàng)
522人瀏覽過
在C++中使用std::unordered_map存儲自定義類型需提供哈希函數(shù),1. 可特化std::hash模板并重載operator==;2. 或傳遞自定義哈希函數(shù)對象;3. 多字段組合推薦用質(zhì)數(shù)混合避免沖突;4. 注意哈希一致性與相等比較的實(shí)現(xiàn)。

c++中如何定義一個哈希函數(shù)用于自定義類型的unordered_map_c++自定義哈希函數(shù)編寫方法

在C++中使用std::unordered_map存儲自定義類型時(shí),如果該類型沒有默認(rèn)的哈希支持,就需要手動提供一個哈希函數(shù)??梢酝ㄟ^特化std::hash或傳遞自定義哈希函數(shù)對象來實(shí)現(xiàn)。

1. 特化 std::hash 模板

這是最常見的方式,適用于作為鍵的自定義結(jié)構(gòu)體或類。

示例:定義一個表示二維點(diǎn)的結(jié)構(gòu)體,并為其特化std::hash

#include <unordered_map><br>#include <iostream><br><br>struct Point {<br>    int x, y;<br>    Point(int x, int y) : x(x), y(y) {}<br><br>    // 重載 == 運(yùn)算符(unordered_map 需要)<br>    bool operator==(const Point& other) const {<br>        return x == other.x && y == other.y;<br>    }<br>};<br><br>// 自定義 hash 特化<br>namespace std {<br>    template<><br>    struct hash<Point> {<br>        size_t operator()(const Point& p) const {<br>            // 使用哈希組合技巧<br>            size_t h1 = hash<int>{}(p.x);<br>            size_t h2 = hash<int>{}(p.y);<br>            // 簡單異或 + 位移避免對稱性問題<br>            return h1 ^ (h2 << 1);<br>        }<br>    };<br>}<br><br>int main() {<br>    unordered_map<Point, string> pointMap;<br>    pointMap[Point(1, 2)] = "origin";<br>    pointMap[Point(3, 4)] = "target";<br><br>    for (const auto& [pt, label] : pointMap) {<br>        cout << "(" << pt.x << "," << pt.y << "): " << label << endl;<br>    }<br>    return 0;<br>}
登錄后復(fù)制

2. 使用獨(dú)立的函數(shù)對象(Functor)

如果不希望或不能在std::命名空間中添加特化(比如涉及第三方類型),可以傳入自定義哈希類作為模板參數(shù)。

通義萬相
通義萬相

通義萬相,一個不斷進(jìn)化的AI藝術(shù)創(chuàng)作大模型

通義萬相596
查看詳情 通義萬相

struct PointHash {<br>    size_t operator()(const Point& p) const {<br>        size_t h1 = hash<int>{}(p.x);<br>        size_t h2 = hash<int>{}(p.y);<br>        return h1 ^ (h2 << 1);<br>    }<br>};<br><br>// 使用方式:<br>unordered_map<Point, string, PointHash> pointMap;<br>
登錄后復(fù)制

3. 哈希組合建議

多個字段組合時(shí),簡單異或可能造成沖突(如(1,2)(2,1)哈希相同)。推薦使用更穩(wěn)健的方法:

立即學(xué)習(xí)C++免費(fèi)學(xué)習(xí)筆記(深入)”;

  • 使用質(zhì)數(shù)乘法混合:h1 + 0x9e3779b9 + (h2 << 6) + (h2 >> 2)
  • 調(diào)用std::hash_combine(雖然標(biāo)準(zhǔn)未直接提供,但可模仿 Boost 實(shí)現(xiàn))
  • 利用 C++ 標(biāo)準(zhǔn)庫中的散列組合技巧
一個更安全的組合方式:

size_t operator()(const Point& p) const {<br>    size_t seed = 0;<br>    seed ^= hash<int>{}(p.x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);<br>    seed ^= hash<int>{}(p.y) + 0x9e3779b9 + (seed << 6) + (seed >> 2);<br>    return seed;<br>}
登錄后復(fù)制

4. 注意事項(xiàng)

  • 必須同時(shí)重載operator==,因?yàn)?code>unordered_map需要判斷鍵是否相等
  • 哈希函數(shù)應(yīng)盡量均勻分布,減少碰撞
  • 特化std::hash應(yīng)在std::hash1命名空間內(nèi),且只能針對用戶定義類型
  • 確保哈希值計(jì)算是確定性的(相同輸入始終產(chǎn)生相同輸出)
基本上就這些。只要提供好哈希函數(shù)和相等比較,自定義類型就能順利用于unordered_map。

以上就是c++++中如何定義一個哈希函數(shù)用于自定義類型的unordered_map_c++自定義哈希函數(shù)編寫方法的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!

c++速學(xué)教程(入門到精通)
c++速學(xué)教程(入門到精通)

c++怎么學(xué)習(xí)?c++怎么入門?c++在哪學(xué)?c++怎么學(xué)才快?不用擔(dān)心,這里為大家提供了c++速學(xué)教程(入門到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
最新問題
開源免費(fèi)商場系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號