• unordered_map的键值不能直接用pair;而map 可以使用 pair 作为键值,而不需要额外定义哈希函数


     如果写了unordered_map< pair ...  ,会报奇怪的错误:

     但是换成map就好了。

    ——————

    unordered_map:

    unordered_map 的键值类型可以是 pair,但在使用时需要注意一些问题。让我来解释一下:

    1. 自定义哈希函数:由于 unordered_map 默认不支持 pair 作为键值,你需要提供一个哈希函数来告诉编译器如何计算 pair 类型的哈希值。你可以通过重载 std::hash 模板来实现这一点。

    2. 定义哈希函数:你可以自己定义一个哈希函数,用于计算 pair 类型的哈希值。这个哈希函数应该接受一个 pair 类型的参数,并返回一个 size_t 类型的哈希值。

    3. 注意 std::pair 的哈希函数:C++11 提供了 std::hash 模板的特化版本用于 std::pair,但你需要确保 std::hash 已经包含在你的头文件中。

    下面是一个示例,展示了如何定义一个哈希函数来支持 pair 作为 unordered_map 的键值:

    (注意是重写unordered_map的第三个模板参数(哈希函数类型))

    具体来说,在 unordered_map 中:

    • Key 是键类型。
    • T 是值类型。
    • Hash 是哈希函数类型。
    • KeyEqual 是键相等比较器类型(默认为 std::equal_to)。
    • Allocator 是分配器类型(默认为 std::allocator>)。

    1. #include <iostream>
    2. #include <unordered_map>
    3. using namespace std;
    4. // 自定义哈希函数
    5. struct pair_hash {
    6. template <class T1, class T2>
    7. size_t operator () (const pair<T1,T2> &p) const {
    8. auto h1 = hash<T1>{}(p.first);
    9. auto h2 = hash<T2>{}(p.second);
    10. return h1 ^ h2; // 哈希组合
    11. }
    12. };
    13. int main() {
    14. unordered_map<pair<int, int>, int, pair_hash> myMap;
    15. // 添加键值对
    16. myMap[make_pair(1, 2)] = 10;
    17. myMap[make_pair(3, 4)] = 20;
    18. // 访问键值对
    19. cout << myMap[make_pair(1, 2)] << endl; // 输出 10
    20. cout << myMap[make_pair(3, 4)] << endl; // 输出 20
    21. return 0;
    22. }

    在这个示例中,我们定义了一个名为 pair_hash 的结构体,重载了 operator() 来计算 pair 类型的哈希值。然后在定义 unordered_map 时,指定了这个自定义的哈希函数。

    ——————

    map:

    map 可以使用 pair 作为键值,而不需要额外定义哈希函数。这是因为 map 使用红黑树(Red-Black Tree)来实现,而不是哈希表。

    红黑树是一种自平衡二叉搜索树,它在插入和删除操作时通过一系列旋转和颜色变换来保持树的平衡,从而保证了插入、删除和搜索的时间复杂度都是 O(log n)。

    在 map 中,pair 的比较方式取决于 pair 中两个元素的比较方式。具体来说,map 会根据 pair 的第一个元素进行比较,如果第一个元素相等,则比较第二个元素。所以,pair 的比较不是简单地将两个元素相加,而是按照元素的大小依次比较。

    例如,对于 pair 类型的键值,map 会按照先比较第一个整数,如果相等再比较第二个整数。

  • 相关阅读:
    209. 长度最小的子数组(滑动窗口)
    谈谈我对服务网格的理解
    分析开源机器学习框架TensorFlow
    简单代理模式
    吐血推荐:无解的完成图
    小学生python游戏编程arcade----坦克换色
    站长告诉怎么选择网站服务器
    常见树种(贵州省):005竹类
    重新定义客户服务 UniPro Mailhandler 彻底改变团队处理请求模式
    线索二叉树操作详解(详细图例+cpp实现+源码)
  • 原文地址:https://blog.csdn.net/JK01WYX/article/details/138029732